sub : attrlist
authorSpider Boardman <spider@orb.nashua.nh.us>
Sun, 29 Aug 1999 03:02:11 +0000 (23:02 -0400)
committerJarkko Hietaniemi <jhi@iki.fi>
Sun, 29 Aug 1999 11:10:33 +0000 (11:10 +0000)
To: Mailing list Perl5 <perl5-porters@perl.org>
Message-Id: <199908290702.DAA32191@Orb.Nashua.NH.US>

p4raw-id: //depot/cfgperl@4043

31 files changed:
MANIFEST
Makefile.SH
embed.h
embed.pl
global.sym
gv.c
lib/AutoSplit.pm
lib/SelfLoader.pm
lib/attributes.pm [new file with mode: 0644]
objXSUB.h
op.c
perl.c
perl.h
perlapi.c
perly.c
perly.fixer
perly.h
perly.y
perly_c.diff
pod/perldelta.pod
pod/perldiag.pod
pod/perlfunc.pod
pod/perlmodlib.pod
pod/perlsub.pod
proto.h
t/lib/attrs.t [new file with mode: 0644]
t/op/attrs.t [new file with mode: 0644]
toke.c
vms/perly_c.vms
vms/perly_h.vms
xsutils.c [new file with mode: 0644]

index 746c4a2..f5ea95c 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -640,6 +640,7 @@ lib/User/grent.pm   By-name interface to Perl's builtin getgr*
 lib/User/pwent.pm      By-name interface to Perl's builtin getpw*
 lib/abbrev.pl          An abbreviation table builder
 lib/assert.pl          assertion and panic with stack trace
+lib/attributes.pm      For "sub foo : attrlist"
 lib/autouse.pm         Load and call a function only when it's used
 lib/base.pm            Establish IS-A relationship at compile time
 lib/bigfloat.pl                An arbitrary precision floating point package
@@ -1117,6 +1118,7 @@ t/io/read.t               See if read works
 t/io/tell.t            See if file seeking works
 t/lib/abbrev.t         See if Text::Abbrev works
 t/lib/anydbm.t         See if AnyDBM_File works
+t/lib/attrs.t          See if attrs works with C<sub : attrs>
 t/lib/autoloader.t     See if AutoLoader works
 t/lib/basename.t       See if File::Basename works
 t/lib/bigfloat.t       See if bigfloat.pl works
@@ -1218,6 +1220,7 @@ t/op/append.t             See if . works
 t/op/arith.t           See if arithmetic works
 t/op/array.t           See if array operations work
 t/op/assignwarn.t      See if OP= operators warn correctly for undef targets
+t/op/attrs.t           See if attributes on declarations work
 t/op/auto.t            See if autoincrement et all work
 t/op/avhv.t            See if pseudo-hashes work
 t/op/bop.t             See if bitops work
@@ -1496,3 +1499,4 @@ x2p/str.h         Public declarations for the above
 x2p/util.c             Utility routines
 x2p/util.h             Public declarations for the above
 x2p/walk.c             Parse tree walker
+xsutils.c              Additional bundled package methods not in UNIVERSAL::
index 73a9b6f..e7fb039 100644 (file)
@@ -231,13 +231,14 @@ h = $(h1) $(h2) $(h3) $(h4) $(h5)
 
 c1 = $(mallocsrc) av.c scope.c op.c doop.c doio.c dump.c hv.c mg.c
 c2 = perl.c perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c
-c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c universal.c globals.c perlio.c
+c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c universal.c xsutils.c
+c4 = globals.c perlio.c
 
-c = $(c1) $(c2) $(c3) miniperlmain.c perlmain.c
+c = $(c1) $(c2) $(c3) $(c4) miniperlmain.c perlmain.c
 
 obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) op$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT)
 obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
-obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT)
+obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) xsutils$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT)
 
 obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
 
diff --git a/embed.h b/embed.h
index a8b80ec..1d33518 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define tmps_grow              Perl_tmps_grow
 #define sv_rvweaken            Perl_sv_rvweaken
 #define magic_killbackrefs     Perl_magic_killbackrefs
+#define newANONATTRSUB         Perl_newANONATTRSUB
+#define newATTRSUB             Perl_newATTRSUB
+#define newMYSUB               Perl_newMYSUB
+#define my_attrs               Perl_my_attrs
+#define boot_core_xsutils      Perl_boot_core_xsutils
 #if defined(PERL_OBJECT)
 #endif
 #if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
 #define gv_ename               S_gv_ename
 #define cv_clone2              S_cv_clone2
 #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
 #  if defined(PL_OP_SLAB_ALLOC)
 #define Slab_Alloc             S_Slab_Alloc
 #  endif
 #if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
 #define isa_lookup             S_isa_lookup
 #endif
+#if defined(PERL_IN_XSUTILS_C) || defined(PERL_DECL_PROT)
+#define modify_SV_attributes   S_modify_SV_attributes
+#endif
 #if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
 #define mess_alloc             S_mess_alloc
 #  if defined(LEAKTEST)
 #define tmps_grow(a)           Perl_tmps_grow(aTHX_ a)
 #define sv_rvweaken(a)         Perl_sv_rvweaken(aTHX_ a)
 #define magic_killbackrefs(a,b)        Perl_magic_killbackrefs(aTHX_ a,b)
+#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)
+#define my_attrs(a,b)          Perl_my_attrs(aTHX_ a,b)
+#define boot_core_xsutils()    Perl_boot_core_xsutils(aTHX)
 #if defined(PERL_OBJECT)
 #endif
 #if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
 #define gv_ename(a)            S_gv_ename(aTHX_ a)
 #define cv_clone2(a,b)         S_cv_clone2(aTHX_ a,b)
 #define scalar_mod_type(a,b)   S_scalar_mod_type(aTHX_ a,b)
+#define my_kid(a,b)            S_my_kid(aTHX_ a,b)
+#define dup_attrlist(a)                S_dup_attrlist(aTHX_ a)
+#define apply_attrs(a,b,c)     S_apply_attrs(aTHX_ a,b,c)
 #  if defined(PL_OP_SLAB_ALLOC)
 #define Slab_Alloc(a,b)                S_Slab_Alloc(aTHX_ a,b)
 #  endif
 #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)            S_scan_str(aTHX_ a)
+#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)
 #if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
 #define isa_lookup(a,b,c,d)    S_isa_lookup(aTHX_ a,b,c,d)
 #endif
+#if defined(PERL_IN_XSUTILS_C) || defined(PERL_DECL_PROT)
+#define modify_SV_attributes(a,b,c,d)  S_modify_SV_attributes(aTHX_ a,b,c,d)
+#endif
 #if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
 #define mess_alloc()           S_mess_alloc(aTHX)
 #  if defined(LEAKTEST)
 #define sv_rvweaken            Perl_sv_rvweaken
 #define Perl_magic_killbackrefs        CPerlObj::Perl_magic_killbackrefs
 #define magic_killbackrefs     Perl_magic_killbackrefs
+#define Perl_newANONATTRSUB    CPerlObj::Perl_newANONATTRSUB
+#define newANONATTRSUB         Perl_newANONATTRSUB
+#define Perl_newATTRSUB                CPerlObj::Perl_newATTRSUB
+#define newATTRSUB             Perl_newATTRSUB
+#define Perl_newMYSUB          CPerlObj::Perl_newMYSUB
+#define newMYSUB               Perl_newMYSUB
+#define Perl_my_attrs          CPerlObj::Perl_my_attrs
+#define my_attrs               Perl_my_attrs
+#define Perl_boot_core_xsutils CPerlObj::Perl_boot_core_xsutils
+#define boot_core_xsutils      Perl_boot_core_xsutils
 #if defined(PERL_OBJECT)
 #endif
 #if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
 #define cv_clone2              S_cv_clone2
 #define S_scalar_mod_type      CPerlObj::S_scalar_mod_type
 #define scalar_mod_type                S_scalar_mod_type
+#define S_my_kid               CPerlObj::S_my_kid
+#define my_kid                 S_my_kid
+#define S_dup_attrlist         CPerlObj::S_dup_attrlist
+#define dup_attrlist           S_dup_attrlist
+#define S_apply_attrs          CPerlObj::S_apply_attrs
+#define apply_attrs            S_apply_attrs
 #  if defined(PL_OP_SLAB_ALLOC)
 #define S_Slab_Alloc           CPerlObj::S_Slab_Alloc
 #define Slab_Alloc             S_Slab_Alloc
 #define S_isa_lookup           CPerlObj::S_isa_lookup
 #define isa_lookup             S_isa_lookup
 #endif
+#if defined(PERL_IN_XSUTILS_C) || defined(PERL_DECL_PROT)
+#define S_modify_SV_attributes CPerlObj::S_modify_SV_attributes
+#define modify_SV_attributes   S_modify_SV_attributes
+#endif
 #if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
 #define S_mess_alloc           CPerlObj::S_mess_alloc
 #define mess_alloc             S_mess_alloc
index ef8fc80..0543c0f 100755 (executable)
--- a/embed.pl
+++ b/embed.pl
@@ -1753,6 +1753,11 @@ p        |void   |sv_force_normal|SV *sv
 p      |void   |tmps_grow      |I32 n
 p      |SV*    |sv_rvweaken    |SV *sv
 p      |int    |magic_killbackrefs|SV *sv|MAGIC *mg
+p      |OP*    |newANONATTRSUB |I32 floor|OP *proto|OP *attrs|OP *block
+p      |CV*    |newATTRSUB     |I32 floor|OP *o|OP *proto|OP *attrs|OP *block
+p      |void   |newMYSUB       |I32 floor|OP *o|OP *proto|OP *attrs|OP *block
+p      |OP *   |my_attrs       |OP *o|OP *attrs
+p      |void   |boot_core_xsutils
 
 #if defined(PERL_OBJECT)
 protected:
@@ -1816,6 +1821,9 @@ s |bool   |is_handle_constructor  |OP *o|I32 argnum
 s      |char*  |gv_ename       |GV *gv
 s      |CV*    |cv_clone2      |CV *proto|CV *outside
 s      |bool   |scalar_mod_type|OP *o|I32 type
+s      |OP *   |my_kid         |OP *o|OP *attrs
+s      |OP *   |dup_attrlist   |OP *o
+s      |void   |apply_attrs    |HV *stash|SV *target|OP *attrs
 #  if defined(PL_OP_SLAB_ALLOC)
 s      |void*  |Slab_Alloc     |int m|size_t sz
 #  endif
@@ -1986,7 +1994,7 @@ s |char*  |scan_ident     |char *s|char *send|char *dest \
                                |STRLEN destlen|I32 ck_uni
 s      |char*  |scan_inputsymbol|char *start
 s      |char*  |scan_pat       |char *start|I32 type
-s      |char*  |scan_str       |char *start
+s      |char*  |scan_str       |char *start|int keep_quoted|int keep_delims
 s      |char*  |scan_subst     |char *start
 s      |char*  |scan_trans     |char *start
 s      |char*  |scan_word      |char *s|char *dest|STRLEN destlen \
@@ -2024,6 +2032,10 @@ s        |I32    |win32_textfilter       |int idx|SV *sv|int maxlen
 s      |SV*|isa_lookup |HV *stash|const char *name|int len|int level
 #endif
 
+#if defined(PERL_IN_XSUTILS_C) || defined(PERL_DECL_PROT)
+s      |int|modify_SV_attributes|SV *sv|SV **retlist|SV **attrlist|int numattrs
+#endif
+
 #if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
 s      |SV*    |mess_alloc
 #  if defined(LEAKTEST)
index 7379173..5ee74d7 100644 (file)
@@ -666,3 +666,8 @@ Perl_sv_force_normal
 Perl_tmps_grow
 Perl_sv_rvweaken
 Perl_magic_killbackrefs
+Perl_newANONATTRSUB
+Perl_newATTRSUB
+Perl_newMYSUB
+Perl_my_attrs
+Perl_boot_core_xsutils
diff --git a/gv.c b/gv.c
index 41a66b5..ae76f82 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -677,6 +677,10 @@ Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
            }
        }
        break;
+    case 'V':
+       if (strEQ(name, "VERSION"))
+           GvMULTI_on(gv);
+       break;
 
     case '&':
        if (len > 1)
index 33c0b9a..feecd58 100644 (file)
@@ -11,7 +11,7 @@ use vars qw(
            $Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime
           );
 
-$VERSION = "1.0303";
+$VERSION = "1.0304";
 @ISA = qw(Exporter);
 @EXPORT = qw(&autosplit &autosplit_lib_modules);
 @EXPORT_OK = qw($Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime);
@@ -147,6 +147,13 @@ if (defined (&Dos::UseLFN)) {
 }
 my $Is_VMS = ($^O eq 'VMS');
 
+# allow checking for valid ': attrlist' attachments
+my $nested;
+$nested = qr{ \( (?: (?> [^()]+ ) | (?p{ $nested }) )* \) }x;
+my $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) [\s,]* }x;
+my $attr_list = qr{ \s* : \s* (?: $one_attr )* }x;
+
+
 
 sub autosplit{
     my($file, $autodir,  $keep, $ckal, $ckmt) = @_;
@@ -289,7 +296,7 @@ sub autosplit_file {
        if (/^package\s+([\w:]+)\s*;/) {
            $this_package = $def_package = $1;
        }
-       if (/^sub\s+([\w:]+)(\s*\(.*?\))?/) {
+       if (/^sub\s+([\w:]+)(\s*(?:\(.*?\))?(?:$attr_list)?)/) {
            print OUT "# end of $last_package\::$subname\n1;\n"
                if $last_package;
            $subname = $1;
@@ -459,3 +466,6 @@ 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 { 1; }
+sub test_a2 : locked { 1; }
index c4e9175..4672ac4 100644 (file)
@@ -3,12 +3,18 @@ package SelfLoader;
 require Exporter;
 @ISA = qw(Exporter);
 @EXPORT = qw(AUTOLOAD);
-$VERSION = "1.08";
+$VERSION = "1.09";
 sub Version {$VERSION}
 $DEBUG = 0;
 
 my %Cache;      # private cache for all SelfLoader's client packages
 
+# allow checking for valid ': attrlist' attachments
+my $nested;
+$nested = qr{ \( (?: (?> [^()]+ ) | (?p{ $nested }) )* \) }x;
+my $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) [\s,]* }x;
+my $attr_list = qr{ \s* : \s* (?: $one_attr )* }x;
+
 sub croak { require Carp; goto &Carp::croak }
 
 AUTOLOAD {
@@ -50,7 +56,7 @@ sub _load_stubs {
 
     local($/) = "\n";
     while(defined($line = <$fh>) and $line !~ m/^__END__/) {
-        if ($line =~ m/^sub\s+([\w:]+)\s*(\([\\\$\@\%\&\*\;]*\))?/) {
+       if ($line =~ m/^sub\s+([\w:]+)\s*((?:\([\\\$\@\%\&\*\;]*\))?(?:$attr_list)?)/) {
             push(@stubs, $self->_add_to_cache($name, $currpack, \@lines, $protoype));
             $protoype = $2;
             @lines = ($line);
diff --git a/lib/attributes.pm b/lib/attributes.pm
new file mode 100644 (file)
index 0000000..e49204f
--- /dev/null
@@ -0,0 +1,379 @@
+package attributes;
+
+$VERSION = 0.01;
+
+#@EXPORT_OK = qw(get reftype);
+#@EXPORT = ();
+
+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 }
+
+sub import {
+    @_ > 2 && ref $_[2] or
+       croak 'Usage: use '.__PACKAGE__.' $home_stash, $ref, @attrlist';
+    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 export {
+#    require Exporter;
+#    goto &Exporter::import;
+#}
+#
+#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 ;
+  my $s = sub : method { ... };
+
+  use attributes ();   # optional, to get subroutine declarations
+  my @attrlist = attributes::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, 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 __PACKAGE__, \$x, 'Bent';
+    use attributes __PACKAGE__, \@y, 'Bent';
+    use attributes __PACKAGE__, \%z, 'Bent';
+
+Yes, that's three invocations.
+
+B<WARNING>: attribute declarations for variables are an I<experimental>
+feature.  The semantics of such declarations could change or be removed
+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 attributes happens at compile time.  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
+
+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.
+
+=back
+
+There are no built-in attributes for anything other than subroutines.
+
+=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.  This is primarily because
+the C<use> mechanism which would normally import them is already in use
+by Perl itself to implement the C<sub : attributes> syntax.
+
+=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 as 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, commas, or both.  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 comma nor whitespace
+
+=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 Canine => \$spot, "Watchful";
+
+=item 2.
+
+Code:
+
+    package Felis;
+    my $cat : Nervous;
+
+Effect:
+
+    use attributes 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 2423f58..e7b34b1 100644 (file)
--- a/objXSUB.h
+++ b/objXSUB.h
 #define Perl_magic_killbackrefs        pPerl->Perl_magic_killbackrefs
 #undef  magic_killbackrefs
 #define magic_killbackrefs     Perl_magic_killbackrefs
+#undef  Perl_newANONATTRSUB
+#define Perl_newANONATTRSUB    pPerl->Perl_newANONATTRSUB
+#undef  newANONATTRSUB
+#define newANONATTRSUB         Perl_newANONATTRSUB
+#undef  Perl_newATTRSUB
+#define Perl_newATTRSUB                pPerl->Perl_newATTRSUB
+#undef  newATTRSUB
+#define newATTRSUB             Perl_newATTRSUB
+#undef  Perl_newMYSUB
+#define Perl_newMYSUB          pPerl->Perl_newMYSUB
+#undef  newMYSUB
+#define newMYSUB               Perl_newMYSUB
+#undef  Perl_my_attrs
+#define Perl_my_attrs          pPerl->Perl_my_attrs
+#undef  my_attrs
+#define my_attrs               Perl_my_attrs
+#undef  Perl_boot_core_xsutils
+#define Perl_boot_core_xsutils pPerl->Perl_boot_core_xsutils
+#undef  boot_core_xsutils
+#define boot_core_xsutils      Perl_boot_core_xsutils
 #if defined(PERL_OBJECT)
 #endif
 #if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
 #endif
 #if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
 #endif
+#if defined(PERL_IN_XSUTILS_C) || defined(PERL_DECL_PROT)
+#endif
 #if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
 #  if defined(LEAKTEST)
 #  endif
diff --git a/op.c b/op.c
index e99ef60..42ed8b2 100644 (file)
--- a/op.c
+++ b/op.c
@@ -1576,8 +1576,60 @@ Perl_ref(pTHX_ OP *o, I32 type)
 
 }
 
-OP *
-Perl_my(pTHX_ OP *o)
+STATIC OP *
+S_dup_attrlist(pTHX_ OP *o)
+{
+    OP *rop = Nullop;
+
+    /* An attrlist is either a simple OP_CONST or an OP_LIST with kids,
+     * where the first kid is OP_PUSHMARK and the remaining ones
+     * are OP_CONST.  We need to push the OP_CONST values.
+     */
+    if (o->op_type == OP_CONST)
+       rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc(cSVOPo->op_sv));
+    else {
+       assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS));
+       for (o = cLISTOPo->op_first; o; o=o->op_sibling) {
+           if (o->op_type == OP_CONST)
+               rop = append_elem(OP_LIST, rop,
+                                 newSVOP(OP_CONST, o->op_flags,
+                                         SvREFCNT_inc(cSVOPo->op_sv)));
+       }
+    }
+    return rop;
+}
+
+STATIC void
+S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs)
+{
+    OP *modname;       /* for 'use' */
+    SV *stashsv;
+
+    /* fake up C<use attributes $pkg,$rv,@attrs> */
+    ENTER;             /* need to protect against side-effects of 'use' */
+    SAVEINT(PL_expect);
+    if (stash && HvNAME(stash))
+       stashsv = newSVpv(HvNAME(stash), 0);
+    else
+       stashsv = &PL_sv_no;
+#define ATTRSMODULE "attributes"
+    modname = newSVOP(OP_CONST, 0,
+                     newSVpvn(ATTRSMODULE, sizeof(ATTRSMODULE)-1));
+    modname->op_private |= OPpCONST_BARE;
+    /* that flag is required to make 'use' work right */
+    utilize(1, start_subparse(FALSE, 0),
+           Nullop, /* version */
+           modname,
+           prepend_elem(OP_LIST,
+                        newSVOP(OP_CONST, 0, stashsv),
+                        prepend_elem(OP_LIST,
+                                     newSVOP(OP_CONST, 0, newRV(target)),
+                                     dup_attrlist(attrs))));
+    LEAVE;
+}
+
+STATIC OP *
+S_my_kid(pTHX_ OP *o, OP *attrs)
 {
     OP *kid;
     I32 type;
@@ -1588,7 +1640,7 @@ Perl_my(pTHX_ OP *o)
     type = o->op_type;
     if (type == OP_LIST) {
        for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
-           my(kid);
+           my_kid(kid, attrs);
     } else if (type == OP_UNDEF) {
        return o;
     } else if (type != OP_PADSV &&
@@ -1599,11 +1651,43 @@ Perl_my(pTHX_ OP *o)
        yyerror(Perl_form(aTHX_ "Can't declare %s in my", PL_op_desc[o->op_type]));
        return o;
     }
+    else if (attrs && type != OP_PUSHMARK) {
+       HV *stash;
+       SV *padsv;
+       SV **namesvp;
+
+       /* check for C<my Dog $spot> when deciding package */
+       namesvp = av_fetch(PL_comppad_name, o->op_targ, FALSE);
+       if (namesvp && *namesvp && SvOBJECT(*namesvp) && HvNAME(SvSTASH(*namesvp)))
+           stash = SvSTASH(*namesvp);
+       else
+           stash = PL_curstash;
+       padsv = PAD_SV(o->op_targ);
+       apply_attrs(stash, padsv, attrs);
+    }
     o->op_flags |= OPf_MOD;
     o->op_private |= OPpLVAL_INTRO;
     return o;
 }
 
+OP *
+Perl_my_attrs(pTHX_ OP *o, OP *attrs)
+{
+    if (o->op_flags & OPf_PARENS)
+       list(o);
+    PL_in_my = FALSE;
+    PL_in_my_stash = Nullhv;
+    if (attrs)
+       SAVEFREEOP(attrs);
+    return my_kid(o, attrs);
+}
+
+OP *
+Perl_my(pTHX_ OP *o)
+{
+    return my_kid(o, Nullop);
+}
+
 OP *
 Perl_sawparens(pTHX_ OP *o)
 {
@@ -2807,9 +2891,10 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *id, OP *arg)
     }
 
     /* Fake up the BEGIN {}, which does its thing immediately. */
-    newSUB(floor,
+    newATTRSUB(floor,
        newSVOP(OP_CONST, 0, newSVpvn("BEGIN", 5)),
        Nullop,
+       Nullop,
        append_elem(OP_LINESEQ,
            append_elem(OP_LINESEQ,
                newSTATEOP(0, Nullch, rqop),
@@ -3896,14 +3981,35 @@ Perl_op_const_sv(pTHX_ OP *o, CV *cv)
     return sv;
 }
 
+void
+Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
+{
+    if (o)
+       SAVEFREEOP(o);
+    if (proto)
+       SAVEFREEOP(proto);
+    if (attrs)
+       SAVEFREEOP(attrs);
+    if (block)
+       SAVEFREEOP(block);
+    Perl_croak(aTHX_ "\"my sub\" not yet implemented");
+}
+
 CV *
 Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block)
+{
+    return Perl_newATTRSUB(aTHX_ floor, o, proto, Nullop, block);
+}
+
+CV *
+Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
 {
     dTHR;
     STRLEN n_a;
     char *name = o ? SvPVx(cSVOPo->op_sv, n_a) : Nullch;
     GV *gv = gv_fetchpv(name ? name : "__ANON__",
-                       GV_ADDMULTI | (block ? 0 : GV_NOINIT), SVt_PVCV);
+                       GV_ADDMULTI | ((block || attrs) ? 0 : GV_NOINIT),
+                       SVt_PVCV);
     char *ps = proto ? SvPVx(((SVOP*)proto)->op_sv, n_a) : Nullch;
     register CV *cv=0;
     I32 ix;
@@ -3912,8 +4018,10 @@ Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block)
        SAVEFREEOP(o);
     if (proto)
        SAVEFREEOP(proto);
+    if (attrs)
+       SAVEFREEOP(attrs);
 
-    if (SvTYPE(gv) != SVt_PVGV) {      /* Prototype now, and had
+    if (SvTYPE(gv) != SVt_PVGV) {      /* Maybe prototype now, and had at
                                           maximum a prototype before. */
        if (SvTYPE(gv) > SVt_NULL) {
            if (!SvPOK((SV*)gv) && !(SvIOK((SV*)gv) && SvIVX((SV*)gv) == -1)
@@ -3941,7 +4049,7 @@ Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block)
        if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
            SV* const_sv;
            bool const_changed = TRUE;
-           if (!block) {
+           if (!block && !attrs) {
                /* just a "sub foo;" when &foo is already defined */
                SAVEFREESV(PL_compcv);
                goto done;
@@ -3949,6 +4057,8 @@ Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block)
            /* ahem, death to those who redefine active sort subs */
            if (PL_curstackinfo->si_type == PERLSI_SORT && PL_sortcop == CvSTART(cv))
                Perl_croak(aTHX_ "Can't redefine active sort subroutine %s", name);
+           if (!block)
+               goto withattrs;
            if(const_sv = cv_const_sv(cv))
                const_changed = sv_cmp(const_sv, op_const_sv(block, Nullcv));
            if ((const_sv && const_changed) || ckWARN(WARN_REDEFINE) 
@@ -3960,14 +4070,46 @@ Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block)
                PL_curcop->cop_line = PL_copline;
                Perl_warner(aTHX_ WARN_REDEFINE,
                        const_sv ? "Constant subroutine %s redefined"
-                                : "Subroutine %s redefined", name);
+                                : "Subroutine %s redefined", name);
                PL_curcop->cop_line = oldline;
            }
            SvREFCNT_dec(cv);
            cv = Nullcv;
        }
     }
+  withattrs:
+    if (attrs) {
+       HV *stash;
+       SV *rcv;
+
+       /* Need to do a C<use attributes $stash_of_cv,\&cv,@attrs>
+        * before we clobber PL_compcv.
+        */
+       if (cv && !block) {
+           rcv = (SV*)cv;
+           if (CvGV(cv) && GvSTASH(CvGV(cv)) && HvNAME(GvSTASH(CvGV(cv))))
+               stash = GvSTASH(CvGV(cv));
+           else if (CvSTASH(cv) && HvNAME(CvSTASH(cv)))
+               stash = CvSTASH(cv);
+           else
+               stash = PL_curstash;
+       }
+       else {
+           /* possibly about to re-define existing subr -- ignore old cv */
+           rcv = (SV*)PL_compcv;
+           if (name && GvSTASH(gv) && HvNAME(GvSTASH(gv)))
+               stash = GvSTASH(gv);
+           else
+               stash = PL_curstash;
+       }
+       apply_attrs(stash, rcv, attrs);
+    }
     if (cv) {                          /* must reuse cv if autoloaded */
+       if (!block) {
+           /* got here with just attrs -- work done, so bug out */
+           SAVEFREESV(PL_compcv);
+           goto done;
+       }
        cv_undef(cv);
        CvFLAGS(cv) = CvFLAGS(PL_compcv);
        CvOUTSIDE(cv) = CvOUTSIDE(PL_compcv);
@@ -4155,10 +4297,11 @@ Perl_newCONSTSUB(pTHX_ HV *stash, char *name, SV *sv)
     if(stash)
        PL_curstash = PL_curcop->cop_stash = stash;
 
-    newSUB(
+    newATTRSUB(
        start_subparse(FALSE, 0),
        newSVOP(OP_CONST, 0, newSVpv(name,0)),
        newSVOP(OP_CONST, 0, &PL_sv_no),        /* SvPV(&PL_sv_no) == "" -- GMB */
+       Nullop,
        newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
     );
 
@@ -4310,9 +4453,16 @@ Perl_newANONHASH(pTHX_ OP *o)
 
 OP *
 Perl_newANONSUB(pTHX_ I32 floor, OP *proto, OP *block)
+{
+    return newANONATTRSUB(floor, proto, Nullop, block);
+}
+
+OP *
+Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block)
 {
     return newUNOP(OP_REFGEN, 0,
-       newSVOP(OP_ANONCODE, 0, (SV*)newSUB(floor, 0, proto, block)));
+       newSVOP(OP_ANONCODE, 0,
+               (SV*)newATTRSUB(floor, 0, proto, attrs, block)));
 }
 
 OP *
diff --git a/perl.c b/perl.c
index a5816a9..3c3a629 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -926,6 +926,7 @@ print \"  \\@INC:\\n    @INC\\n\";");
     CvPADLIST(PL_compcv) = comppadlist;
 
     boot_core_UNIVERSAL();
+    boot_core_xsutils();
 
     if (xsinit)
        (*xsinit)(aTHXo);       /* in case linked C routines want magical variables */
diff --git a/perl.h b/perl.h
index 678cef5..5d84aec 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -2429,6 +2429,8 @@ typedef enum {
     XREF,
     XSTATE,
     XBLOCK,
+    XATTRBLOCK,
+    XATTRTERM,
     XTERMBLOCK
 } expectation;
 
index f409754..1945146 100755 (executable)
--- a/perlapi.c
+++ b/perlapi.c
@@ -4779,6 +4779,41 @@ Perl_magic_killbackrefs(pTHXo_ SV *sv, MAGIC *mg)
 {
     return ((CPerlObj*)pPerl)->Perl_magic_killbackrefs(sv, mg);
 }
+
+#undef  Perl_newANONATTRSUB
+OP*
+Perl_newANONATTRSUB(pTHXo_ I32 floor, OP *proto, OP *attrs, OP *block)
+{
+    return ((CPerlObj*)pPerl)->Perl_newANONATTRSUB(floor, proto, attrs, block);
+}
+
+#undef  Perl_newATTRSUB
+CV*
+Perl_newATTRSUB(pTHXo_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
+{
+    return ((CPerlObj*)pPerl)->Perl_newATTRSUB(floor, o, proto, attrs, block);
+}
+
+#undef  Perl_newMYSUB
+void
+Perl_newMYSUB(pTHXo_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
+{
+    ((CPerlObj*)pPerl)->Perl_newMYSUB(floor, o, proto, attrs, block);
+}
+
+#undef  Perl_my_attrs
+OP *
+Perl_my_attrs(pTHXo_ OP *o, OP *attrs)
+{
+    return ((CPerlObj*)pPerl)->Perl_my_attrs(o, attrs);
+}
+
+#undef  Perl_boot_core_xsutils
+void
+Perl_boot_core_xsutils(pTHXo)
+{
+    ((CPerlObj*)pPerl)->Perl_boot_core_xsutils();
+}
 #if defined(PERL_OBJECT)
 #endif
 #if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
@@ -4834,6 +4869,8 @@ Perl_magic_killbackrefs(pTHXo_ SV *sv, MAGIC *mg)
 #endif
 #if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
 #endif
+#if defined(PERL_IN_XSUTILS_C) || defined(PERL_DECL_PROT)
+#endif
 #if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
 #  if defined(LEAKTEST)
 #  endif
diff --git a/perly.c b/perly.c
index 37af6da..e1458d8 100644 (file)
--- a/perly.c
+++ b/perly.c
@@ -7,6 +7,10 @@ static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/91";
 #define PERL_IN_PERLY_C
 #include "perl.h"
 
+#define dep() deprecate("\"do\" to call subroutines")
+
+/* stuff included here to make perly_c.diff apply better */
+
 #define yydebug            PL_yydebug
 #define yynerrs            PL_yynerrs
 #define yyerrflag   PL_yyerrflag
@@ -14,1117 +18,1116 @@ static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/91";
 #define yyval      PL_yyval
 #define yylval     PL_yylval
 
-#define dep() deprecate("\"do\" to call subroutines")
+struct ysv {
+    short* yyss;
+    YYSTYPE* yyvs;
+    int oldyydebug;
+    int oldyynerrs;
+    int oldyyerrflag;
+    int oldyychar;
+    YYSTYPE oldyyval;
+    YYSTYPE oldyylval;
+};
 
 static void yydestruct(pTHXo_ void *ptr);
 
-#line 27 "perly.y"
+#line 49 "perly.y"
+#if 0 /* get this from perly.h instead */
+#line 52 "perly.y"
+typedef union {
+    I32        ival;
+    char *pval;
+    OP *opval;
+    GV *gvval;
+} YYSTYPE;
+#line 60 "perly.y"
+#endif /* 0 */
+
+#ifdef USE_PURE_BISON
+#define YYLEX_PARAM (&yychar)
+#endif
+
+#line 51 "perly.c"
 #define YYERRCODE 256
-static short yylhs[] = {                                 -1,
-   46,    0,    9,    7,   10,    8,   11,   11,   11,   12,
-   12,   12,   12,   25,   25,   25,   25,   25,   25,   25,
-   15,   15,   15,   14,   14,   43,   43,   13,   13,   13,
-   13,   13,   13,   13,   27,   27,   28,   28,   29,   30,
-   31,   32,   33,   45,   45,    1,    1,    1,    1,    3,
-   39,   39,   47,    4,    5,    6,   40,   41,   41,   42,
-   42,   48,   48,   50,   49,   16,   16,   16,   26,   26,
-   26,   37,   37,   37,   37,   37,   37,   37,   37,   51,
-   37,   38,   38,   18,   18,   18,   18,   18,   18,   18,
-   18,   18,   18,   18,   17,   17,   17,   17,   17,   17,
-   17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
-   17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
-   17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
+static short yylhs[] = {                                        -1,
+   50,    0,    8,    6,    9,    7,   10,   10,   10,   11,
+   11,   11,   11,   24,   24,   24,   24,   24,   24,   24,
+   14,   14,   14,   13,   13,   42,   42,   12,   12,   12,
+   12,   12,   12,   12,   26,   26,   27,   27,   28,   29,
+   30,   31,   32,   49,   49,    1,    1,    1,    1,    1,
+    2,   38,   38,   46,   51,    3,    4,    5,   39,   40,
+   40,   44,   44,   44,   45,   45,   41,   41,   52,   52,
+   54,   53,   15,   15,   15,   25,   25,   25,   36,   36,
+   36,   36,   36,   36,   36,   36,   55,   36,   37,   37,
    17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
-   17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
-   17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
-   17,   17,   34,   34,   35,   35,   35,    2,    2,   44,
-   24,   19,   20,   21,   22,   23,   36,   36,   36,   36,
+   17,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   16,   16,   16,   16,   16,   16,   16,   16,   16,   16,
+   47,   47,   48,   48,   48,   48,   48,   33,   33,   34,
+   34,   34,   43,   23,   18,   19,   20,   21,   22,   35,
+   35,   35,   35,
 };
-static short yylen[] = {                                  2,
+static short yylen[] = {                                         2,
     0,    2,    4,    0,    4,    0,    0,    2,    2,    2,
     1,    2,    3,    1,    1,    3,    3,    3,    3,    3,
     0,    2,    6,    7,    7,    0,    2,    8,    8,   10,
     9,    8,   11,    3,    0,    1,    0,    1,    1,    1,
-    1,    1,    1,    0,    1,    1,    1,    1,    1,    4,
-    1,    0,    5,    0,    0,    0,    1,    0,    1,    1,
-    1,    3,    2,    0,    7,    3,    3,    1,    2,    3,
-    1,    3,    5,    6,    3,    3,    5,    2,    4,    0,
-    5,    1,    1,    5,    4,    5,    4,    5,    6,    5,
-    4,    5,    4,    3,    3,    3,    3,    3,    3,    3,
-    3,    3,    3,    3,    3,    3,    5,    3,    2,    2,
-    2,    2,    2,    2,    2,    2,    2,    2,    3,    2,
-    3,    2,    4,    3,    4,    1,    1,    1,    1,    1,
-    1,    6,    5,    4,    5,    1,    1,    3,    4,    3,
-    2,    2,    4,    5,    4,    5,    1,    2,    2,    1,
-    2,    2,    2,    1,    3,    1,    3,    4,    4,    6,
-    1,    1,    0,    1,    0,    1,    2,    1,    1,    1,
-    2,    2,    2,    2,    2,    2,    1,    1,    1,    1,
+    1,    1,    1,    0,    1,    1,    1,    1,    1,    1,
+    4,    1,    0,    6,    6,    0,    0,    0,    1,    0,
+    1,    0,    2,    1,    2,    1,    1,    1,    3,    2,
+    0,    7,    3,    3,    1,    2,    3,    1,    3,    5,
+    6,    3,    3,    5,    2,    4,    0,    5,    1,    1,
+    5,    4,    5,    4,    5,    6,    5,    4,    5,    4,
+    3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+    3,    3,    3,    5,    3,    2,    2,    2,    2,    2,
+    2,    2,    2,    2,    1,    2,    3,    2,    3,    2,
+    4,    3,    5,    1,    1,    1,    1,    1,    1,    6,
+    5,    4,    5,    1,    1,    3,    4,    3,    2,    2,
+    4,    5,    4,    5,    1,    2,    2,    1,    2,    2,
+    2,    1,    3,    1,    3,    4,    4,    6,    1,    1,
+    3,    2,    3,    2,    1,    1,    1,    0,    1,    0,
+    1,    2,    1,    2,    2,    2,    2,    2,    2,    1,
+    1,    1,    1,
 };
-static short yydefred[] = {                               1,
-    0,    7,    0,   45,   56,   54,    0,   54,    8,   46,
-    9,   11,    0,   47,   48,   49,    0,    0,    0,   63,
-   64,   14,    4,  161,    0,    0,  136,    0,  156,    0,
-   55,   55,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  168,  169,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,   12,    0,
-    0,    0,    0,    0,    0,    0,    0,   10,    0,    0,
-    0,    0,    0,  128,  130,    0,    0,    0,    0,  162,
-   51,    0,   57,    0,   62,    0,    7,  177,  180,  179,
-  178,    0,    0,    0,    0,    0,    0,    4,    4,    4,
-    4,    4,    4,    0,    0,    0,    0,    0,  151,    0,
-    0,    0,    0,   78,    0,  175,    0,  142,    0,    0,
-    0,    0,    0,  171,    0,    0,    0,    0,    0,    0,
-    0,    0,  122,    0,    0,    0,  172,  173,  174,  176,
-    0,    0,   34,    0,    0,    0,    0,    0,    0,    0,
+static short yydefred[] = {                                      1,
+    0,    7,    0,   45,   58,   56,    0,   56,   56,    8,
+   46,    9,   11,   48,    0,   47,   49,   50,    0,    0,
+    0,   70,   71,    0,   14,    4,  169,    0,    0,  144,
+    0,  164,    0,   57,   57,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,  114,  115,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   13,    0,   50,   59,
-    0,    0,    0,   76,    0,    0,   80,    0,    0,    0,
-    0,    0,    0,    0,    4,  155,  157,    0,    0,    0,
-    0,    0,    0,    0,  124,    0,  140,    0,    0,  121,
-   27,    0,    0,   19,    0,    0,    0,    0,   66,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,   82,    0,    0,   83,    0,    0,
-   94,    0,    0,    0,    0,    0,    0,    0,  138,    0,
-    0,   61,   60,   53,    0,    3,    0,    0,  159,    0,
-  125,    0,   42,    0,   43,    0,    0,    0,    0,  170,
-    0,    0,   36,   41,    0,    0,    0,  158,  167,   79,
-    0,  143,    0,  145,    0,  123,    0,    0,    0,    0,
-   91,    0,    0,    0,    0,   93,   87,    0,   85,    0,
-  134,    0,  139,    0,   77,    0,   81,    0,    0,    0,
-    0,    0,    0,    0,    0,   73,  144,  146,  133,    0,
-    0,    0,   92,   86,    0,   90,   88,  135,   84,   65,
-  160,    6,    0,    0,    0,    0,    0,    0,    0,    0,
-  132,   89,   74,    7,   28,   29,    0,    0,   24,   25,
-    0,   32,    0,    0,    0,   22,    0,    0,    0,   31,
-    5,    0,   30,    0,    0,   33,    0,   23,
+    0,   12,    0,    0,    0,    0,    0,    0,    0,   10,
+    0,    0,    0,    0,    0,  136,  138,    0,    0,    0,
+    0,  170,  125,   52,    0,   59,    0,   69,    0,    0,
+    7,  190,  193,  192,  191,    0,    0,    0,    0,    0,
+    0,    4,    4,    4,    4,    4,    4,    0,    0,    0,
+    0,    0,  159,    0,    0,    0,    0,   85,    0,  188,
+    0,  150,    0,    0,    0,    0,    0,    0,    0,  175,
+  177,  176,    0,  184,    0,    0,    0,    0,    0,    0,
+    0,    0,  130,    0,    0,    0,  185,  186,  187,  189,
+    0,   34,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  121,  122,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,   13,    0,   51,   61,    0,
+    0,    0,    0,   83,    0,    0,   87,    0,    0,    0,
+    0,    0,    0,    0,    4,  163,  165,    0,    0,    0,
+    0,    0,    0,    0,  132,    0,  148,  174,    0,    0,
+  171,    0,    0,  129,   27,    0,    0,   19,    0,    0,
+    0,    0,   73,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   89,    0,
+    0,   90,    0,    0,  101,    0,    0,    0,    0,    0,
+    0,    0,  146,    0,    0,    0,    0,    0,    0,    3,
+    0,    0,  167,    0,    0,    0,   42,    0,   43,    0,
+    0,    0,    0,  183,    0,    0,   36,   41,    0,    0,
+    0,  166,  182,   86,    0,  151,    0,  153,    0,  131,
+  173,   65,    0,    0,    0,    0,   98,    0,    0,    0,
+    0,  100,   94,    0,   92,    0,  142,    0,  147,   63,
+   68,   67,   55,    0,   54,   84,    0,   88,  133,    0,
+    0,    0,    0,    0,    0,    0,    0,   80,  152,  154,
+  141,    0,    0,    0,   99,   93,    0,   97,   95,  143,
+   91,   72,  168,    6,    0,    0,    0,    0,    0,    0,
+    0,    0,  140,   96,   81,    7,   28,   29,    0,    0,
+   24,   25,    0,   32,    0,    0,    0,   22,    0,    0,
+    0,   31,    5,    0,   30,    0,    0,   33,    0,   23,
 };
-static short yydgoto[] = {                                1,
-    9,   66,   10,   18,   96,   17,   87,  344,   90,  333,
-    3,   11,   12,   68,  349,  267,   70,   71,   72,   73,
-   74,   75,   76,   77,  273,   79,  274,  263,  265,  268,
-  276,  264,  266,  114,  200,   92,   80,  239,   82,   84,
-  181,  254,  143,  271,   13,    2,   14,   15,   16,   86,
-  260,
+static short yydgoto[] = {                                       1,
+   10,   11,   20,  100,   19,   91,  366,   94,  355,    3,
+   12,   13,   70,  371,  281,   72,   73,   74,   75,   76,
+   77,   78,   79,  287,   81,  288,  277,  279,  282,  290,
+  278,  280,  118,  210,   96,   82,  253,   85,   87,  190,
+  323,  152,  285,  267,  221,   14,   83,  133,   15,    2,
+   16,   17,   18,   89,  274,
 };
-static short yysindex[] = {                               0,
-    0,    0,  142,    0,    0,    0,  -57,    0,    0,    0,
-    0,    0,  622,    0,    0,    0, -239, -229,  -10,    0,
-    0,    0,    0,    0,  -24,  -24,    0,   -5,    0, 2126,
-    0,    0,    6,   28,   44,   57,  -32, 2126,   68,   69,
-   72,  999,  943,  -24, 1062, 1327, -198,    0,    0,  -24,
- 2126, 2126, 2126, 2126, 2126, 2126, 1233, 1383,    0, 2126,
- 2126,  -24,  -24,  -24,  -24, 2126, -217,    0,  342,  827,
-  -20,  -80,  -70,    0,    0,  -60,   73,   61,   75,    0,
-    0,   -1,    0, -137,    0, -130,    0,    0,    0,    0,
-    0, 2126,   88, 2126, -189,   -1, -137,    0,    0,    0,
-    0,    0,    0,   89,  827,   99, 1444,  943,    0, -189,
-    0,  -80,   75,    0, 2126,    0,   90,    0, -189,  -16,
-   27,  -58, 2126,    0,   75,  218,  218,  218, -169, -169,
-   63,  -22,    0,  -63,  218,  218,    0,    0,    0,    0,
- -189,   -1,    0, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
- 2126, 2126, 2126, 2126,    0,    0,   74, 2126, 1535, 2126,
- 2126, 2126, 2126, 2126, 2126, 1725,    0, 2126,    0,    0,
-  -44,  -91,  256,    0, 2126,  428,    0,   -1, 2126, 2126,
- 2126, 2126,  131, 1800,    0,    0,    0,  -12,   36,  130,
- 2126,   75, 1861, 1936,    0,   48,    0, 2126,   87,    0,
-    0, -272, -272,    0, -272, -272, -272, -119,    0, 1565,
- -189, 1088,  375,  160,  827,  715,  389,  771,  684, 1026,
- 1242,  218,  218, 2126,    0, 2006, 2126,    0,  143,  -56,
-    0,    1,   51,  -49,   56,   43,   58,   45,    0,    7,
-  827,    0,    0,    0, 2126,    0,  141, 2126,    0, 2126,
-    0, -272,    0,  144,    0,  145, -272,  151,  158,    0,
-  162,  342,    0,    0,  166,  150, 2126,    0,    0,    0,
-    9,    0,   16,    0,   19,    0,   60, 2126, 2126,   47,
-    0,   21,   94, 2126,   78,    0,    0,   91,    0,   95,
-    0,  101,    0,  153,    0,  268,    0,   92,   92,   92,
-   92, 2126,   92, 2126,  188,    0,    0,    0,    0,   96,
- 1152,  109,    0,    0,  196,    0,    0,    0,    0,    0,
-    0,    0, -217, -217, -204, -204,  198, -217,  185,   92,
-    0,    0,    0,    0,    0,    0,   92,  211,    0,    0,
-   92,    0, 1800, -217,  319,    0, 2126, -217,  216,    0,
-    0,  228,    0,   92,   92,    0, -204,    0,
+static short yysindex[] = {                                      0,
+    0,    0, -199,    0,    0,    0,  -53,    0,    0,    0,
+    0,    0,    0,    0,  646,    0,    0,    0, -217, -207,
+   44,    0,    0, -207,    0,    0,    0,  -32,  -32,    0,
+   66,    0, 2177,    0,    0,   69,   83,   93,  110,  -35,
+ 2177,  119,  121,  136, 1013,  973,  -32, 1077, 1344, -146,
+ 2177,   68,  -32, 2177, 2177, 2177, 2177, 2177, 2177, 1384,
+ 1424,    0, 2177, 2177,  -32,  -32,  -32,  -32, -152,    0,
+  470,  845,  -13,  -65,  -63,    0,    0,   55,  137,  122,
+  138,    0,    0,    0,   60,    0,  -70,    0,  -66,  -70,
+    0,    0,    0,    0,    0, 2177,  146, 2177, 1085,   60,
+  -70,    0,    0,    0,    0,    0,    0,  152,  845,  153,
+ 1464,  973,    0, 1085,    0,  -65,  138,    0, 2177,    0,
+  160,    0, 1085,    2,   76,  -52, 2177, 1085, 1524,    0,
+    0,    0,  -96,    0,  138, -181, -181, -181, -112, -112,
+  123,  -38,    0,  -74, -181, -181,    0,    0,    0,    0,
+   60,    0, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177,
+ 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177,
+ 2177, 2177, 2177,    0,    0,  -16, 2177, 1731, 2177, 2177,
+ 2177, 2177, 2177, 2177, 1791,    0, 2177,    0,    0,  -88,
+  -34,  -88,  339,    0, 2177,  287,    0,  -88, 2177, 2177,
+ 2177, 2177,  173, 1850,    0,    0,    0,  -33,   46,  180,
+ 2177,  138, 1910, 2025,    0,   97,    0,    0,  -31,  -29,
+    0, 2177,  133,    0,    0, -237, -237,    0, -237, -237,
+ -237,  -69,    0, 1614, 1085,  684,  167,  107,  845, 3800,
+ 1125,  405, 1164,  778, -228, -181, -181, 2177,    0, 2117,
+ 2177,    0,  197,  -48,    0,   -9,  -72,  -45,   -7,  -42,
+   56,  -36,    0,   -4,  845,  -10,  -47, 2177,  -47,    0,
+  216, 2177,    0, 2177,   60, -237,    0,  219,    0,  230,
+ -237,  233,  237,    0,  242,  470,    0,    0,  246,  225,
+ 2177,    0,    0,    0,   13,    0,   18,    0,   29,    0,
+    0,    0,   61, 2177, 2177,   54,    0,   32,   63, 2177,
+  165,    0,    0,  174,    0,  178,    0,  191,    0,    0,
+    0,    0,    0,  261,    0,    0,  350,    0,    0,  182,
+  182,  182,  182, 2177,  182, 2177,  281,    0,    0,    0,
+    0,  102, 1237,  202,    0,    0,  294,    0,    0,    0,
+    0,    0,    0,    0, -152, -152, -130, -130,  297, -152,
+  290,  182,    0,    0,    0,    0,    0,    0,  182,  318,
+    0,    0,  182,    0, 1850, -152,  407,    0, 2177, -152,
+  324,    0,    0,  326,    0,  182,  182,    0, -130,    0,
 };
-static short yyrindex[] = {                               0,
-    0,    0,  225,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  155,    0,    0,    0,
+static short yyrindex[] = {                                      0,
+    0,    0,  243,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  236,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,   23, 2214,    0,
-    0, 2264, 2308,    0,    0,    0,    0,    0,    0,    0,
+   36,  451,    0,    0, 2208, 2271,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  105,    0,  -18, 1030,
2383, 2433, 2561,    0,    0, 2636, 2686,    0,  918,    0,
   0,    0,    0,  -25,    0,    0,    0,    0,    0,    0,
-    0, 2308,    0,    0, 3879,    0,  165,    0,    0,    0,
   0,    0,    0,    0, 1356,    0,    0,  232,    0, 3936,
-  502,  561, 3047,    0,    0,    0, 2730,    0, 3987, 2433,
   0,    0, 2308,    0, 3096, 3236, 3300, 3436, 1656, 3186,
2780,    0,    0,    0, 3487, 3550,    0,    0,    0,    0,
4025,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  115,    0,
 -12,  939, 2325, 2385, 2463,    0,    0, 2510, 2561,    0,
1220,    0,    0,    0,    0,    0,  -44,    0,    0,  -44,
+    0,    0,    0,    0,    0, 2271,    0,    0, 3846,    0,
-105,    0,    0,    0,    0,    0,    0,    0, 2612,    0,
+    0,  327,    0, 3883,  522,  583, 3032,    0,    0,    0,
2621,    0, 3893, 2385,    0,    0, 2271, 3930,    0,    0,
   0,    0, 2667,    0, 3092, 3374, 3418, 3458, 3219, 3331,
2746,    0,    0,    0, 3496, 3567,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0, 2828,    0,    0,
-    0,    0,  887,    0,  232,    0,    0,    0,  242,    0,
-    0,    0,    0,  226,    0,    0,    0,    0,  249,    0,
-    0, 3142,    0,    0,    0,    0,    0,    0, 2889,    0,
-    0,   -4,   10,    0,   11,   17,   24,  363,    0,  -27,
-  664, 3890, 3686, 3737, 1507,    0, 4291, 4188, 4155, 4035,
- 3842, 3586, 3623,    0,    0,    0,    0,    0, 2983,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
- 1640,    0,    0,    0,  233,    0,    0,    0,    0, 2308,
-    0,   37,    0,    0,    0,    0,  262,    0,    0,    0,
-    0,   52,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0, 2797,    0,    0,  -23,
+    0,  -23,  913,    0,  327,    0,    0,  247,  336,    0,
+    0,    0,    0,  333,    0,    0,    0,    0,  352,    0,
+    0, 3138,    0,    0,    0,    0,    0,    0,    0, 2857,
+    0,    0, 2903,    0,    0,   -8,   -2,    0,    7,   33,
+   42, 2255,    0,  -28, 3968, 1822, 3732, 3769, 3023,    0,
+ 4119, 4082, 4021, 4005, 1044, 3610, 3694,    0,    0,    0,
+    0,    0, 2949,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0, 3657,  -21,    0,  345,    0,    0,
+    0,    0,    0, 2271,    0,   71,    0,    0,    0,    0,
+  364,    0,    0,    0,    0,   86,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  232,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  327,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  264,    0,    0,    0,    0,    0,    0,
-  -19,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  105,  105,  168,  168,    0,  105,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  298,  105,  887,    0,    0,  105,    0,    0,
-    0,    0,    0,    0,    0,    0,  168,    0,
+    0,    0,    0,    0,    0,  355,    0,    0,    0,    0,
+    0,    0, 2972,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,  115,  115,  175,  175,    0,  115,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,  374,  115,  913,    0,    0,  115,
+    0,    0,    0,    0,    0,    0,    0,    0,  175,    0,
 };
-static short yygindex[] = {                               0,
-    0,    0,    0,  339,  320,    0,  -11,    0,  913,  360,
-  -78,    0,    0,    0, -320,  -13, 4321,    0, 1367,    0,
-    0,    0,    0,    0,  340,  -38,    0,    0,  215, -138,
-   14,   97,  190,  -85, -179,  583,    0,    0,    0,    0,
-  286,    0, -140,    0,    0,    0,    0,    0,    0,    0,
-    0,
+static short yygindex[] = {                                      0,
+    0,    0,  164,  383,    0,   14,    0,   37,  655,  -89,
+    0,    0,    0, -336,  -15, 3415,    0, 2211,  368,  369,
+    0,    0,    0,  410,  916,    0,    0,  273, -163,   62,
+   94,  249,  -71, -186,  634,    0,    0,    0,  428,  -46,
+  184,  118,    0, -149,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,
 };
-#define YYTABLESIZE 4610
-static short yytable[] = {                               69,
-  206,   20,  295,   62,  113,  257,  184,  103,  183,  298,
-  172,   62,  125,  104,  252,  350,  104,   81,  209,  169,
-  174,  107,   15,  204,  107,  149,  150,   83,  278,  210,
-  104,  104,  122,   58,   94,  104,   18,  207,  107,  107,
-   15,  296,  171,  132,  134,   98,  368,  303,   85,  316,
-   39,   16,  173,  113,   18,  275,  317,   17,  123,  318,
-  142,  323,  175,  147,   20,  104,  147,   99,   39,   16,
-  170,  347,  348,  107,  172,   17,  202,   38,   23,  279,
-  147,  147,   20,  100,  113,  147,  189,  190,  191,  192,
-  193,  194,   40,  198,  199,   38,  101,   58,   23,  154,
-  155,  300,  168,  302,   26,  322,  171,  106,  107,   62,
-   15,  108,  176,  236,  325,  147,  162,  163,  178,  177,
-  164,   23,  180,  165,  166,  167,  182,  185,  195,  203,
-  212,  213,  215,  216,  217,  218,  219,   26,  315,  196,
-   26,   26,   26,  297,   26,  167,   26,   26,  299,   26,
-  301,  205,  319,  208,  240,  242,  243,  244,  245,  246,
-  247,  248,  250,   26,  237,  255,   62,   21,   26,  304,
-  280,  199,  286,  337,  307,  262,  213,  288,  213,  150,
-  272,  305,  294,  277,  308,  309,  324,  281,  341,  283,
-  285,  310,  345,  346,  287,   26,  234,  352,  311,   19,
-   21,  312,  326,   21,   21,   21,  313,   21,  314,   21,
-   21,  330,   21,  360,  332,  327,  113,  363,  362,  328,
-  290,  113,  292,  293,    2,  329,   21,   26,  340,   26,
-   26,   21,   88,  342,  149,  150,  343,   89,  351,  149,
-  150,  149,  150,  353,  104,  104,  104,  104,  149,  150,
-  357,  104,  107,  107,  107,  107,  364,   44,   21,  107,
-   44,   44,   44,  102,   44,  355,   44,   44,  365,   44,
-  104,  104,  165,  104,  320,  149,  150,   52,  107,  107,
-  199,  107,   37,   44,   35,  149,  150,   58,   44,  166,
-   21,  163,   21,   21,  147,  147,  147,  147,  149,  150,
-  262,  147,   40,  147,  149,  150,  149,  150,  331,  147,
-  147,  147,  147,  149,  150,   44,  149,  150,  149,  150,
-  147,  147,   37,  147,  147,  147,  147,  147,  147,  147,
-  157,  235,  147,  149,  150,  147,  147,  147,   35,   69,
-  149,  150,  149,  150,  149,  150,   21,   44,  149,  150,
-   44,   97,   78,  149,  150,  149,  150,  149,  150,  214,
-   26,   26,   26,   26,   26,   26,  359,   26,   26,   26,
+#define YYTABLESIZE 4423
+static short yytable[] = {                                      71,
+   65,  193,  223,   65,  107,   22,  216,  292,  271,  301,
+  311,  321,  111,  314,   60,  111,  316,   60,  224,   65,
+  313,  372,  318,  250,  194,  181,  178,  183,   15,  111,
+  111,  312,   18,  126,  111,   62,  319,   64,   39,   84,
+  289,  214,  269,  192,  142,  144,   15,   16,  275,   86,
+   18,   69,  390,  338,  198,  217,   39,  180,  339,  182,
+  163,  164,  158,  159,  111,   16,    4,    5,    6,  340,
+    7,    8,  345,   17,  251,   26,  155,  179,   60,  155,
+  172,  113,   20,  173,  122,  315,  174,  175,  176,  293,
+   26,   17,  181,  155,  155,  208,  209,    9,  155,   62,
+   20,   64,   88,   65,   67,   98,  248,  129,  102,  177,
+  127,   38,  344,  219,   26,  199,  200,  201,  202,  203,
+  204,  188,  103,  347,  180,  151,   40,  337,  155,   38,
+  173,   66,  104,  174,  175,  176,  197,  226,  227,  229,
+  230,  231,  232,  233,   15,  369,  370,   26,  317,  105,
+   26,   26,   26,  341,   26,  346,   26,   26,  110,   26,
+  111,  254,  256,  257,  258,  259,  260,  261,  262,  264,
+  359,   23,   24,   26,   21,  112,  185,  184,   26,  209,
+  186,  187,   26,  276,  227,  195,  227,  225,  286,  189,
+  191,  205,   60,  206,  363,  295,  324,  297,  299,  213,
+  215,  220,  328,   21,  176,   26,  303,   21,   65,  266,
+   21,   21,   21,  222,   21,  384,   21,   21,  291,   21,
+  294,  300,  268,  304,   92,  158,  159,  158,  159,   93,
+  302,  159,  306,   21,  308,  309,  310,   26,   21,   26,
+   26,  249,    2,  111,  111,  111,  111,  158,  159,  320,
+  111,  158,  159,   60,  158,  159,  326,  158,  159,  330,
+  106,  158,  159,  158,  159,   21,  158,  159,  158,  159,
+  331,  111,  111,  332,  111,   44,  377,  333,   44,   44,
+   44,  334,   44,  336,   44,   44,  335,   44,  342,  348,
+  158,  159,  158,  159,  209,  158,  159,   21,  349,   21,
+   21,   44,  350,  322,  354,  322,   44,  155,  155,  155,
+  155,  329,  158,  159,  155,  351,  155,  158,  159,  352,
+  276,  362,  155,  155,  155,  155,  364,  273,  158,  159,
+  272,  158,  159,   44,  365,  155,  155,  373,  155,  155,
+  155,  155,  155,  155,  155,  158,  159,  155,  375,  166,
+  155,  155,  155,  158,  159,  158,  159,  379,   53,   71,
+  158,  159,  158,  159,  386,   44,  387,  180,   44,   62,
+   26,   26,   26,   26,   26,   26,   37,   26,   26,   26,
    26,   26,   26,   26,   26,   26,   26,   26,   26,   26,
-  256,  269,  188,   26,   26,    0,   26,   26,   26,   26,
-   26,  149,  150,  149,  150,   26,   26,   26,   26,   26,
-   26,    0,    0,   67,   26,    0,   67,    4,    5,    6,
-  339,    7,    8,   26,    0,   26,   26,    0,    0,    0,
-    0,   67,    0,   21,   21,   21,   21,   21,   21,    0,
+  353,   35,  181,   26,   26,  163,   26,   26,   26,   26,
+   26,  158,  159,  178,   40,   26,   26,   26,   26,   26,
+   26,   26,  166,   37,   35,  172,   26,  101,  173,  131,
+  132,  174,  175,  176,   80,   26,  228,   26,   26,  361,
+   21,   21,   21,   21,   21,   21,  381,   21,   21,   21,
    21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-   21,   21,   21,  361,    0,    0,   21,   21,  154,   21,
-   21,   21,   21,   21,    0,   67,    0,    0,   21,   21,
-   21,   21,   21,   21,    0,    0,  163,   21,  259,  164,
-    0,  258,  165,  166,  167,    0,   21,    0,   21,   21,
-   44,   44,   44,   44,   44,   44,    0,   44,   44,   44,
-  157,    0,    0,   44,    0,    0,   44,   44,   44,   44,
-    0,    0,    0,   44,   44,    0,   44,   44,   44,   44,
-   44,    0,    0,    0,    0,   44,   44,   44,   44,   44,
-   44,    4,    5,    6,   44,    7,    8,  164,    0,    0,
-  165,  166,  167,   44,  177,   44,   44,  177,  177,  177,
-    0,  177,  161,  177,  177,  161,  177,    0,  151,    0,
-    0,    0,    0,    0,  152,  153,  154,  155,    0,  161,
-  161,    0,    0,    0,  161,  177,    0,    0,  156,  158,
-  159,  160,  161,  162,  163,    0,    0,  164,    0,    0,
-  165,  166,  167,    0,    4,    5,    6,    0,    7,    8,
-    0,    0,  177,  178,  161,    0,  178,  178,  178,    0,
-  178,  126,  178,  178,  126,  178,    0,    0,   93,    0,
-    0,    0,    0,  144,  145,  146,  147,    0,  126,  126,
-  148,    0,    0,  126,  178,  115,  116,  177,    0,    0,
-    0,    0,  124,    0,   67,   67,   67,   67,    0,  149,
-  150,   67,    0,    0,  137,  138,  139,  140,    0,    0,
-    0,    0,    0,  126,   52,    0,    0,   62,   64,   50,
-   67,   57,    0,   65,   61,    0,   60,    0,  334,  335,
-  336,    0,  338,    0,    0,  152,  153,  154,  155,    0,
-   59,  163,    0,    0,  164,   63,  178,  165,  166,  167,
-  201,  159,  160,  161,  162,  163,    0,    0,  164,  354,
-    0,  165,  166,  167,  100,    0,  356,  100,  151,    0,
-  358,    0,   58,    0,  152,  153,  154,  155,    0,    0,
-    0,  100,  100,  366,  367,    0,  100,    0,  156,  158,
-  159,  160,  161,  162,  163,    0,    0,  164,    0,    0,
-  165,  166,  167,    0,   23,    0,    0,   53,    0,    0,
-    0,    0,    0,    0,    0,    0,  100,    0,  177,  177,
-  177,  177,  177,    0,  177,  177,  177,    0,    0,    0,
-  177,    0,  289,  161,  161,  161,  161,  157,    0,    0,
-  161,  177,  161,  177,  177,  177,  177,  177,  161,  161,
-  161,  161,  177,  177,  177,  177,  177,  177,    0,  161,
-  161,  177,  161,  161,  161,  161,  161,  161,  161,    0,
-  177,  161,  177,  177,  161,  161,  161,  178,  178,  178,
-  178,  178,    0,  178,  178,  178,    0,    0,    0,  178,
-    0,    0,  126,  126,  126,  126,    0,    0,    0,  126,
-  178,  126,  178,  178,  178,  178,  178,  126,  126,  126,
-  126,  178,  178,  178,  178,  178,  178,    0,  126,  126,
-  178,  126,  126,  126,  126,  126,  126,  126,    0,  178,
-  126,  178,  178,  126,  126,  126,    0,   22,   24,   25,
-   26,   27,   28,    0,   29,   30,   31,    0,    0,  157,
-   32,    0,    0,   33,   34,   35,   36,    0,    0,    0,
-   37,   38,    0,   39,   40,   41,   42,   43,    0,    0,
-    0,    0,   44,   45,   46,   47,   48,   49,    0,   44,
-    0,   51,   44,   44,   44,   67,   44,    0,   44,   44,
-   54,   44,   55,   56,    0,  100,  100,  100,  100,    0,
-    0,    0,  100,    0,  100,   44,    0,    0,    0,    0,
-   44,  100,    0,    0,  109,    0,    0,  118,   68,    0,
-    0,  100,  100,    0,  100,  100,  100,  100,  100,    0,
-  152,  153,  154,  155,    0,   52,   68,   44,   62,   64,
-   50,    0,   57,    0,   65,   61,    0,   60,  161,  162,
-  163,    0,    0,  164,  179,  151,  165,  166,  167,    0,
-    0,  152,  153,  154,  155,    0,   63,    0,  187,   44,
-   68,    0,   44,    0,    0,  156,  158,  159,  160,  161,
-  162,  163,    0,    0,  164,    0,    0,  165,  166,  167,
-    0,   52,    0,   58,   62,   64,   50,    0,   57,    0,
-   65,   61,    0,   60,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,  211,    0,    0,  152,  153,  154,
-  155,    0,   63,    0,    0,   23,    0,    0,   53,    0,
-   71,    0,    0,   71,  160,  161,  162,  163,    0,    0,
-  164,    0,    0,  165,  166,  167,    0,   71,   71,   58,
-    0,    0,    0,  253,   52,    0,    0,   62,   64,   50,
-  261,   57,    0,   65,   61,    0,   60,  151,    0,    0,
-    0,    0,    0,  152,  153,  154,  155,    0,    0,    0,
-    0,   23,   71,    0,   53,   63,    0,  156,  158,  159,
-  160,  161,  162,  163,    0,    0,  164,    0,    0,  165,
-  166,  167,   44,   44,   44,   44,   44,   44,    0,   44,
-   44,   44,   58,    0,    0,   44,    0,    0,   44,   44,
-   44,   44,    0,    0,    0,   44,   44,    0,   44,   44,
-   44,   44,   44,    0,    0,    0,    0,   44,   44,   44,
-   44,   44,   44,    0,   23,    0,   44,   53,    0,   68,
-   68,   68,   68,    0,    0,   44,   68,   44,   44,  111,
-   25,   26,   27,   28,   89,   29,   30,   31,    0,    0,
-    0,   32,    0,    0,  157,   68,   68,    0,    0,    0,
-    0,    0,   38,    0,   39,   40,   41,   42,   43,    0,
-    0,    0,    0,   44,   45,   46,   47,   48,   49,    0,
-    0,    0,   51,    0,    0,    0,    0,    0,    0,    0,
-    0,   54,    0,   55,   56,   24,   25,   26,   27,   28,
-    0,   29,   30,   31,    0,   52,    0,   32,   62,   64,
-   50,    0,   57,  131,   65,   61,    0,   60,   38,    0,
-   39,   40,   41,   42,   43,    0,    0,    0,    0,   44,
-   45,   46,   47,   48,   49,    0,   63,    0,   51,    0,
-    0,   71,   71,   71,   71,    0,    0,   54,   71,   55,
-   56,    0,  152,  153,  154,  155,    0,    0,  117,   25,
-   26,   27,   28,   58,   29,   30,   31,   71,   71,    0,
-   32,  162,  163,    0,    0,  164,    0,    0,  165,  166,
-  167,   38,    0,   39,   40,   41,   42,   43,    0,    0,
-    0,    0,   44,   45,   46,   47,   48,   49,   53,   52,
-    0,   51,   62,   64,   50,    0,   57,    0,   65,   61,
-   54,   60,   55,   56,  152,    0,  154,  155,    0,    0,
-    0,    0,    0,    0,    0,  121,    0,    0,    0,    0,
-   63,   91,   91,  162,  163,    0,  148,  164,    0,  148,
-  165,  166,  167,  104,    0,    0,    0,    0,    0,  112,
-   91,  120,    0,  148,  148,   52,   91,   58,   62,   64,
-   50,    0,   57,    0,   65,   61,    0,   60,   91,   91,
-   91,   91,  151,    0,    0,    0,    0,    0,  152,  153,
-  154,  155,    0,    0,    0,    0,   63,    0,  148,    0,
-    0,    0,   53,  158,  159,  160,  161,  162,  163,    0,
-    0,  164,    0,    0,  165,  166,  167,    0,    0,    0,
-    0,    0,    0,   58,  112,  133,   52,    0,    0,   62,
-   64,   50,    0,   57,  197,   65,   61,    0,   60,   24,
-   25,   26,   27,   28,    0,   29,   30,   31,    0,    0,
-    0,   32,    0,    0,    0,    0,    0,   63,   53,    0,
-    0,    0,   38,    0,   39,   40,   41,   42,   43,    0,
-    0,    0,    0,   44,   45,   46,   47,   48,   49,    0,
-  154,  155,   51,  238,   58,    0,    0,    0,    0,    0,
-    0,   54,    0,   55,   56,    0,    0,   95,  163,    0,
-   95,  164,    0,    0,  165,  166,  167,    0,    0,  270,
-    0,    0,    0,    0,   95,   95,    0,   52,    0,   53,
-   62,   64,   50,    0,   57,  241,   65,   61,    0,   60,
-    0,    0,    0,   24,   25,   26,   27,   28,    0,   29,
-   30,   31,    0,    0,    0,   32,    0,    0,   63,   95,
-    0,    0,    0,    0,    0,    0,   38,    0,   39,   40,
-   41,   42,   43,    0,    0,    0,    0,   44,   45,   46,
-   47,   48,   49,    0,    0,   58,   51,  148,  148,  148,
-  148,    0,    0,    0,  148,   54,    0,   55,   56,   24,
-   25,   26,   27,   28,    0,   29,   30,   31,    0,    0,
-    0,   32,    0,  148,  148,    0,    0,    0,    0,    0,
-   53,    0,   38,    0,   39,   40,   41,   42,   43,    0,
-    0,    0,    0,   44,   45,   46,   47,   48,   49,    0,
-   70,    0,   51,   70,    0,    0,    0,    0,    0,    0,
-    0,   54,    0,   55,   56,    0,  116,   70,   70,  116,
-   24,   25,   26,   27,   28,    0,   29,   30,   31,    0,
-    0,    0,   32,  116,  116,    0,    0,    0,  116,    0,
-    0,    0,    0,   38,    0,   39,   40,   41,   42,   43,
-    0,    0,   70,    0,   44,   45,   46,   47,   48,   49,
-    0,    0,    0,   51,    0,    0,    0,    0,  116,    0,
-    0,    0,   54,    0,   55,   56,    0,   52,    0,    0,
-   62,   64,   50,    0,   57,  249,   65,   61,    0,   60,
-    0,    0,    0,    0,    0,    0,    0,    0,   95,   95,
-   95,   95,    0,    0,    0,   95,    0,    0,   63,    0,
-    0,   24,   25,   26,   27,   28,    0,   29,   30,   31,
-    0,    0,    0,   32,   95,   95,    0,    0,    0,    0,
-    0,    0,    0,    0,   38,   58,   39,   40,   41,   42,
-   43,    0,    0,    0,    0,   44,   45,   46,   47,   48,
-   49,    0,   52,    0,   51,   62,   64,   50,    0,   57,
-    0,   65,   61,   54,   60,   55,   56,    0,    0,    0,
-   53,  152,  153,  154,  155,    0,    0,    0,    0,    0,
-    0,    0,    0,   63,    0,    0,  158,  159,  160,  161,
-  162,  163,    0,    0,  164,    0,    0,  165,  166,  167,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   58,    0,    0,   52,    0,    0,   62,   64,   50,    0,
-   57,  282,   65,   61,    0,   60,    0,    0,    0,    0,
-    0,   70,   70,   70,   70,    0,    0,    0,   70,    0,
-    0,    0,    0,    0,   63,   53,    0,  116,  116,  116,
-  116,    0,    0,    0,  116,    0,  116,   70,   70,    0,
-    0,    0,  116,  116,  116,  116,    0,    0,    0,    0,
-    0,   58,    0,  116,  116,    0,  116,  116,  116,  116,
-  116,  116,  116,    0,    0,  116,    0,    0,   52,    0,
-    0,   62,   64,   50,    0,   57,  284,   65,   61,    0,
-   60,   24,   25,   26,   27,   28,   53,   29,   30,   31,
-    0,    0,    0,   32,    0,    0,    0,    0,    0,   63,
-    0,    0,    0,    0,   38,    0,   39,   40,   41,   42,
-   43,    0,    0,    0,    0,   44,   45,   46,   47,   48,
-   49,    0,    0,    0,   51,    0,   58,    0,    0,    0,
-    0,    0,    0,   54,    0,   55,   56,    0,   52,    0,
-    0,   62,   64,   50,    0,   57,  291,   65,   61,    0,
-   60,    0,    0,    0,    0,   22,   24,   25,   26,   27,
-   28,   53,   29,   30,   31,    0,    0,    0,   32,   63,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   38,
-    0,   39,   40,   41,   42,   43,    0,    0,    0,    0,
-   44,   45,   46,   47,   48,   49,   58,    0,    0,   51,
-    0,    0,    0,    0,    0,    0,    0,    0,   54,    0,
-   55,   56,    0,    0,    0,    0,    0,   24,   25,   26,
-   27,   28,    0,   29,   30,   31,    0,    0,    0,   32,
-    0,   53,    0,    0,    0,    0,    0,    0,    0,    0,
-   38,    0,   39,   40,   41,   42,   43,    0,    0,    0,
-    0,   44,   45,   46,   47,   48,   49,    0,   52,    0,
-   51,   62,   64,   50,    0,   57,    0,   65,   61,   54,
-   60,   55,   56,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   63,
-    0,    0,   24,   25,   26,   27,   28,    0,   29,   30,
-   31,    0,    0,    0,   32,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   38,   58,   39,   40,   41,
-   42,   43,    0,    0,    0,    0,   44,   45,   46,   47,
-   48,   49,    0,    0,    0,   51,    0,    0,    0,    0,
-    0,    0,    0,    0,   54,    0,   55,   56,    0,    0,
-    0,   53,    0,    0,  154,    0,    0,  154,    0,    0,
-    0,    0,   24,   25,   26,   27,   28,    0,   29,   30,
-   31,  154,  154,    0,   32,    0,  154,    0,    0,    0,
-    0,    0,    0,    0,    0,   38,    0,   39,   40,   41,
-   42,   43,    0,    0,    0,    0,   44,   45,   46,   47,
-   48,   49,    0,    0,  150,   51,  154,  150,    0,    0,
-    0,    0,    0,    0,   54,    0,   55,   56,    0,    0,
-    0,  150,  150,    0,    0,    0,  150,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,  163,    0,
-    0,  163,    0,    0,    0,    0,  150,    0,    0,    0,
-    0,    0,    0,    0,    0,  163,  163,    0,    0,    0,
-  163,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   24,   25,   26,   27,   28,    0,   29,   30,
-   31,    0,    0,    0,   32,    0,    0,    0,    0,    0,
-  163,    0,    0,    0,    0,   38,    0,   39,   40,   41,
-   42,   43,    0,    0,    0,    0,   44,   45,   46,   47,
-   48,   49,    0,  131,    0,   51,  131,    0,    0,    0,
-    0,    0,    0,    0,   54,    0,   55,   56,    0,    0,
-  131,  131,    0,    0,    0,  131,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  126,    0,  131,  126,    0,    0,    0,
-    0,    0,    0,    0,    0,  154,  154,  154,  154,    0,
-  126,  126,  154,    0,  154,  126,    0,    0,    0,    0,
-  154,  154,  154,  154,    0,    0,    0,    0,    0,    0,
-    0,  154,  154,    0,  154,  154,  154,  154,  154,  154,
-  154,    0,    0,  154,    0,  126,  154,  154,  154,    0,
-    0,    0,    0,    0,    0,  150,  150,  150,  150,    0,
-    0,    0,  150,    0,  150,    0,    0,    0,    0,    0,
-  150,  150,  150,  150,    0,    0,    0,    0,    0,    0,
-    0,  150,  150,    0,  150,  150,  150,  150,  150,  150,
-  150,    0,    0,  150,    0,    0,  150,  150,  150,  163,
-  163,  163,  163,    0,    0,    0,  163,    0,  163,    0,
-    0,    0,    0,    0,  163,  163,  163,  163,    0,    0,
-    0,  129,    0,    0,  129,  163,  163,    0,  163,  163,
-  163,  163,  163,  163,  163,    0,    0,  163,  129,  129,
-  163,  163,  163,  129,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  129,  131,  131,  131,  131,    0,    0,
-    0,  131,    0,  131,    0,    0,    0,    0,    0,  131,
-  131,  131,  131,    0,    0,    0,  127,    0,    0,  127,
-  131,  131,    0,  131,  131,  131,  131,  131,  131,  131,
-    0,    0,  131,  127,  127,  131,  131,  131,  127,    0,
-    0,    0,    0,    0,  126,  126,  126,  126,    0,    0,
-    0,  126,    0,  126,    0,    0,    0,    0,    0,  126,
-  126,  126,  126,    0,    0,    0,  137,    0,  127,  137,
-  126,  126,    0,  126,  126,  126,  126,  126,  126,  126,
-    0,    0,  126,  137,  137,  126,  126,  126,  137,    0,
+  283,   90,  325,   21,   21,    0,   21,   21,   21,   21,
+   21,    0,    0,  270,    0,   21,   21,   21,   21,   21,
+   21,   21,  367,  368,    0,  172,   21,  374,  173,    0,
+    0,  174,  175,  176,    0,   21,    0,   21,   21,    0,
+    0,  162,    0,  382,  162,    0,    0,  385,   44,   44,
+   44,   44,   44,   44,    0,   44,   44,   44,  162,  162,
+    0,   44,    0,  162,   44,   44,   44,   44,    0,    0,
+    0,   44,   44,    0,   44,   44,   44,   44,   44,    0,
+    0,  383,    0,   44,   44,   44,   44,   44,   44,    0,
+    0,    0,    0,  162,   44,    0,    0,    0,    0,    0,
+    0,    0,    0,   44,  190,   44,   44,  190,  190,  190,
+    0,  190,  169,  190,  190,  169,  190,  160,    0,    0,
+    0,    0,    0,  161,  162,  163,  164,    0,    0,  169,
+  169,    0,    0,    0,  169,  190,    0,    0,    0,  165,
+  167,  168,  169,  170,  171,  172,    0,    0,  173,    0,
+    0,  174,  175,  176,    4,    5,    6,    0,    7,    8,
+    0,    0,  190,    0,  169,  191,    0,    0,  191,  191,
+  191,    0,  191,  134,  191,  191,  134,  191,    0,    0,
+  160,    0,    0,    0,    0,    9,  161,  162,  163,  164,
+  134,  134,    0,    0,    0,  134,  191,  190,    0,    0,
+    0,    0,  165,  167,  168,  169,  170,  171,  172,    0,
+    0,  173,   97,    0,  174,  175,  176,    0,    0,    0,
+    0,    0,    4,    5,    6,  134,    7,    8,   55,  119,
+  120,   65,   67,   53,    0,   60,  134,   68,   64,    0,
+   63,  161,  162,  163,  164,    0,    0,    0,  147,  148,
+  149,  150,    0,    9,   62,    0,    0,    0,  191,   66,
+  169,  170,  171,  172,    0,    0,  173,    0,    0,  174,
+  175,  176,  162,  162,  162,  162,    0,    0,    0,  162,
+    0,  162,    0,    0,    0,    0,   61,  162,  162,  162,
+  162,  153,  154,  155,  156,  211,    0,    0,  157,    0,
+  162,  162,    0,  162,  162,  162,  162,  162,  162,  162,
+    0,    0,  162,    0,    0,  162,  162,  162,   26,  158,
+  159,   56,    0,    0,    0,    0,    0,    0,  190,  190,
+  190,  190,  190,    0,  190,  190,  190,    0,    0,    0,
+  190,    0,    0,  169,  169,  169,  169,    0,    0,    0,
+  169,  190,  169,  190,  190,  190,  190,  190,  169,  169,
+  169,  169,  190,  190,  190,  190,  190,  190,    0,    0,
+    0,  169,  169,  190,  169,  169,  169,  169,  169,  169,
+  169,    0,  190,  169,  190,  190,  169,  169,  169,  191,
+  191,  191,  191,  191,    0,  191,  191,  191,    0,    0,
+    0,  191,    0,    0,  134,  134,  134,  134,    0,    0,
+    0,  134,  191,  134,  191,  191,  191,  191,  191,  134,
+  134,  134,  134,  191,  191,  191,  191,  191,  191,    0,
+    0,    0,  134,  134,  191,  134,  134,  134,  134,  134,
+  134,  134,    0,  191,  134,  191,  191,  134,  134,  134,
+    0,   25,   27,   28,   29,   30,   31,  166,   32,   33,
+   34,    0,    0,    0,   35,    0,    0,   36,   37,   38,
+   39,    0,    0,    0,   40,   41,    0,   42,   43,   44,
+   45,   46,    0,    0,    0,    0,   47,   48,   49,   50,
+   51,   52,    0,    0,    0,   44,    0,   54,   44,   44,
+   44,    0,   44,    0,   44,   44,   57,   44,   58,   59,
+    0,  117,    0,    0,    0,    0,    0,    0,    0,  135,
+  161,   44,  163,  164,    0,    0,   44,    0,    0,   78,
+    0,    0,   78,    0,    0,  356,  357,  358,    0,  360,
+    0,  171,  172,    0,    0,  173,   78,   78,  174,  175,
+  176,    0,    0,   44,    0,   55,    0,    0,   65,   67,
+   53,  117,   60,    0,   68,   64,  376,   63,    0,    0,
+    0,    0,    0,  378,    0,    0,    0,  380,    0,    0,
+    0,   78,    0,    0,  212,   44,   66,    0,   44,    0,
+  388,  389,  117,    0,    0,   55,    0,    0,   65,   67,
+   53,    0,   60,    0,   68,   64,    0,   63,    0,    0,
+    0,    0,    0,   61,  161,  162,  163,  164,    0,    0,
+    0,    0,    0,    0,    0,    0,   66,    0,    0,    0,
+    0,    0,    0,    0,  106,  171,  172,  106,    0,  173,
+    0,    0,  174,  175,  176,   26,    0,    0,   56,    0,
+    0,  106,  106,   61,    0,    0,  106,    0,    0,   55,
+    0,    0,   65,   67,   53,    0,   60,    0,   68,   64,
+    0,   63,    0,    0,    0,  160,    0,    0,    0,    0,
+    0,  161,  162,  163,  164,   26,  106,    0,   56,    0,
+   66,    0,    0,    0,    0,    0,    0,  165,  167,  168,
+  169,  170,  171,  172,    0,    0,  173,    0,    0,  174,
+  175,  176,    0,    0,    0,    0,    0,   61,   44,   44,
+   44,   44,   44,   44,    0,   44,   44,   44,    0,    0,
+    0,   44,    0,  117,   44,   44,   44,   44,    0,  117,
+    0,   44,   44,    0,   44,   44,   44,   44,   44,   26,
+    0,    0,   56,   44,   44,   44,   44,   44,   44,    0,
+   78,   78,   78,   78,   44,    0,    0,   78,    0,    0,
+    0,    0,    0,   44,    0,   44,   44,    0,    0,  115,
+   28,   29,   30,   31,   93,   32,   33,   34,   78,   78,
+    0,   35,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   41,    0,   42,   43,   44,   45,   46,    0,
+   75,    0,    0,   47,   48,   49,   50,   51,   52,   27,
+   28,   29,   30,   31,   54,   32,   33,   34,   75,    0,
+    0,   35,    0,   57,    0,   58,   59,    0,    0,    0,
+    0,    0,   41,    0,   42,   43,   44,   45,   46,  166,
+    0,    0,    0,   47,   48,   49,   50,   51,   52,    0,
+    0,    0,   75,    0,   54,  106,  106,  106,  106,    0,
+    0,    0,  106,   57,  106,   58,   59,    0,    0,    0,
+  106,  106,    0,  121,   28,   29,   30,   31,    0,   32,
+   33,   34,    0,  106,  106,   35,  106,  106,  106,  106,
+  106,  106,    0,    0,    0,    0,   41,    0,   42,   43,
+   44,   45,   46,    0,    0,    0,    0,   47,   48,   49,
+   50,   51,   52,  163,  164,    0,   55,    0,   54,   65,
+   67,   53,    0,   60,    0,   68,   64,   57,   63,   58,
+   59,    0,  171,  172,    0,    0,  173,    0,    0,  174,
+  175,  176,  125,    0,    0,    0,    0,   66,    0,    0,
+    0,  161,  162,  163,  164,    0,   55,    0,    0,   65,
+   67,   53,    0,   60,  141,   68,   64,    0,   63,  168,
+  169,  170,  171,  172,   61,    0,  173,    0,    0,  174,
+  175,  176,    0,    0,    0,    0,    0,   66,    0,    0,
+  161,  162,  163,  164,    0,    0,   55,    0,    0,   65,
+   67,   53,    0,   60,    0,   68,   64,    0,   63,   56,
+  170,  171,  172,    0,   61,  173,    0,    0,  174,  175,
+  176,    0,    0,    0,    0,    0,    0,   66,    0,    0,
+    0,   75,   75,   75,   75,    0,   55,    0,   75,   65,
+   67,   53,    0,   60,  207,   68,   64,    0,   63,   56,
+    0,    0,    0,    0,   61,    0,  143,  160,    0,   75,
+   75,    0,    0,  161,  162,  163,  164,   66,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  167,  168,  169,  170,  171,  172,    0,    0,  173,   56,
+    0,  174,  175,  176,   61,    0,   55,    0,    0,   65,
+   67,   53,    0,   60,  218,   68,   64,    0,   63,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  161,    0,    0,  161,    0,    0,    0,    0,  137,    0,
-    0,    0,    0,    0,    0,    0,    0,  161,  161,    0,
-    0,    0,  161,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,   66,    0,   56,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   27,   28,   29,   30,   31,    0,   32,   33,   34,    0,
+    0,    0,   35,    0,   61,    0,    0,    0,    0,    0,
+    0,    0,    0,   41,    0,   42,   43,   44,   45,   46,
+    0,    0,    0,    0,   47,   48,   49,   50,   51,   52,
+   27,   28,   29,   30,   31,   54,   32,   33,   34,   56,
+    0,    0,   35,    0,   57,    0,   58,   59,    0,    0,
+    0,    0,    0,   41,    0,   42,   43,   44,   45,   46,
+    0,    0,    0,    0,   47,   48,   49,   50,   51,   52,
+   27,   28,   29,   30,   31,   54,   32,   33,   34,    0,
+    0,    0,   35,    0,   57,    0,   58,   59,    0,    0,
+    0,    0,    0,   41,    0,   42,   43,   44,   45,   46,
+    0,    0,    0,    0,   47,   48,   49,   50,   51,   52,
+   27,   28,   29,   30,   31,   54,   32,   33,   34,    0,
+    0,    0,   35,    0,   57,    0,   58,   59,    0,    0,
+    0,    0,    0,   41,    0,   42,   43,   44,   45,   46,
+    0,    0,    0,    0,   47,   48,   49,   50,   51,   52,
+    0,    0,    0,   55,    0,   54,   65,   67,   53,    0,
+   60,  255,   68,   64,   57,   63,   58,   59,    0,    0,
+   27,   28,   29,   30,   31,    0,   32,   33,   34,    0,
+    0,    0,   35,    0,   66,    0,    0,    0,    0,    0,
+    0,    0,    0,   41,    0,   42,   43,   44,   45,   46,
+    0,    0,    0,    0,   47,   48,   49,   50,   51,   52,
+    0,   61,    0,   55,    0,   54,   65,   67,   53,    0,
+   60,  263,   68,   64,   57,   63,   58,   59,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  120,    0,  161,  120,    0,    0,    0,    0,    0,    0,
-    0,    0,  129,  129,  129,  129,    0,  120,  120,  129,
-    0,  129,  120,    0,    0,    0,    0,  129,  129,  129,
-  129,    0,    0,    0,    0,    0,    0,    0,  129,  129,
-    0,  129,  129,  129,  129,  129,  129,  129,   69,    0,
-  129,   69,  120,  129,  129,  129,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   69,   69,    0,    0,    0,
-   69,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  127,  127,  127,
-  127,    0,    0,    0,  127,    0,  127,    0,    0,    0,
-   69,    0,  127,  127,  127,  127,    0,    0,    0,  119,
-    0,    0,  119,  127,  127,    0,  127,  127,  127,  127,
-  127,  127,  127,    0,    0,  127,  119,  119,  127,  127,
-  127,  119,    0,    0,    0,    0,    0,  137,  137,  137,
-  137,    0,    0,    0,  137,    0,  137,    0,    0,    0,
-    0,    0,  137,  137,  137,  137,    0,    0,    0,    0,
-    0,  119,    0,  137,  137,    0,  137,  137,  137,  137,
-  137,  137,  137,    0,    0,  137,    0,    0,  137,  137,
-  137,  161,  161,  161,  161,    0,    0,    0,  161,    0,
-  161,    0,    0,    0,    0,    0,  161,  161,  161,  161,
-    0,    0,    0,   75,    0,    0,   75,  161,  161,    0,
-  161,  161,  161,  161,  161,  161,  161,    0,    0,  161,
-   75,   75,  161,  161,  161,   75,    0,    0,    0,    0,
-    0,  120,  120,  120,  120,    0,    0,    0,  120,    0,
-  120,    0,    0,    0,    0,    0,  120,  120,  120,  120,
-    0,    0,    0,    0,    0,   75,    0,  120,  120,    0,
-  120,  120,  120,  120,  120,  120,  120,  164,    0,  120,
-    0,    0,  120,  120,  120,    0,    0,    0,    0,   69,
-   69,   69,   69,    0,  164,  164,   69,    0,   69,  164,
-    0,    0,    0,    0,   69,   69,   69,   69,    0,    0,
-    0,    0,    0,    0,    0,   69,   69,    0,   69,   69,
-   69,   69,   69,   69,   69,    0,  149,   69,    0,  164,
-   69,   69,   69,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  149,  149,    0,    0,    0,  149,    0,
-  119,  119,  119,  119,    0,    0,    0,  119,    0,  119,
-    0,    0,    0,    0,    0,  119,  119,  119,  119,    0,
-    0,    0,   72,    0,    0,    0,  119,  119,  149,  119,
-  119,  119,  119,  119,  119,  119,    0,    0,  119,   72,
-   72,  119,  119,  119,   72,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   66,    0,   56,    0,    0,    0,
+    0,    0,  108,    0,    0,  108,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  108,
+  108,   61,   55,    0,  108,   65,   67,   53,    0,   60,
+    0,   68,   64,    0,   63,    0,    0,    0,    0,    0,
+  161,  162,  163,  164,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   66,  108,    0,   56,  167,  168,  169,
+  170,  171,  172,    0,    0,  173,    0,    0,  174,  175,
+  176,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   61,    0,   55,    0,    0,   65,   67,   53,    0,   60,
+  296,   68,   64,    0,   63,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  117,    0,    0,  117,
-    0,    0,    0,    0,   72,    0,    0,    0,    0,    0,
-    0,    0,    0,  117,  117,    0,    0,    0,  117,    0,
-    0,    0,    0,    0,   75,   75,   75,   75,    0,    0,
-    0,   75,    0,   75,    0,    0,    0,    0,    0,   75,
-   75,   75,   75,    0,    0,    0,  111,    0,  117,  111,
-   75,   75,    0,   75,   75,   75,   75,   75,   75,   75,
-    0,    0,   75,  111,  111,   75,   75,   75,  111,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,  164,  164,
-  164,  164,    0,    0,    0,  164,    0,  164,  111,    0,
-    0,    0,    0,  164,  164,  164,  164,    0,    0,    0,
-  112,    0,    0,  112,  164,  164,    0,  164,  164,  164,
-  164,  164,  164,  164,    0,    0,  164,  112,  112,  164,
-  164,  164,  112,    0,    0,    0,    0,  149,  149,  149,
-  149,    0,    0,    0,  149,    0,  149,    0,    0,    0,
-    0,    0,  149,  149,  149,  149,    0,    0,    0,    0,
-    0,    0,  112,  149,  149,    0,  149,  149,  149,  149,
-  149,  149,  149,    0,    0,  149,    0,    0,  149,  149,
-  149,    0,    0,   72,   72,   72,   72,    0,    0,    0,
-   72,    0,   72,    0,    0,    0,    0,    0,   72,   72,
-   72,   72,    0,    0,    0,    0,    0,    0,    0,   72,
-   72,    0,   72,   72,   72,   72,   72,   72,   72,    0,
-    0,   72,    0,    0,   72,   72,   72,  117,  117,  117,
-  117,    0,    0,    0,  117,    0,  117,    0,    0,    0,
-    0,    0,  117,  117,  117,  117,  113,    0,    0,  113,
-    0,    0,    0,  117,  117,    0,  117,  117,  117,  117,
-  117,  117,  117,  113,  113,  117,    0,    0,  113,    0,
-    0,    0,    0,    0,    0,    0,    0,  111,  111,  111,
-  111,    0,    0,    0,  111,    0,  111,    0,    0,    0,
-    0,    0,  111,  111,  111,  111,    0,  109,  113,    0,
-  109,    0,    0,  111,  111,    0,  111,  111,  111,  111,
-  111,  111,  111,    0,  109,  109,    0,    0,    0,  109,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  112,  112,  112,  112,    0,    0,    0,  112,  109,
-  112,    0,    0,    0,    0,    0,  112,  112,  112,  112,
-  110,    0,    0,  110,    0,    0,    0,  112,  112,    0,
-  112,  112,  112,  112,  112,  112,  112,  110,  110,    0,
-    0,    0,  110,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  108,    0,    0,  108,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  110,  108,  108,    0,    0,    0,  108,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   96,    0,    0,   96,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,  108,    0,
-   96,   96,    0,    0,    0,   96,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  113,  113,  113,
-  113,    0,    0,    0,  113,   96,  113,    0,    0,    0,
-    0,    0,  113,  113,  113,  113,   97,    0,    0,   97,
-    0,    0,    0,  113,  113,    0,  113,  113,  113,  113,
-  113,  113,  113,   97,   97,    0,    0,    0,   97,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,  109,  109,
-  109,  109,    0,    0,    0,  109,    0,  109,    0,    0,
-    0,    0,    0,  109,  109,  109,  109,   98,   97,    0,
-   98,    0,    0,    0,  109,  109,    0,  109,  109,  109,
-  109,  109,  109,  109,   98,   98,    0,    0,    0,   98,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  110,  110,  110,  110,    0,    0,    0,  110,   98,
-  110,    0,    0,    0,    0,    0,  110,  110,  110,  110,
-    0,    0,    0,    0,    0,    0,    0,  110,  110,    0,
-  110,  110,  110,  110,  110,  110,  110,  108,  108,  108,
-  108,    0,    0,    0,  108,    0,  108,    0,    0,    0,
-    0,    0,  108,  108,  108,  108,    0,    0,    0,    0,
-    0,    0,   99,  108,  108,   99,  108,  108,  108,  108,
-  108,  108,  108,    0,   96,   96,   96,   96,    0,   99,
-   99,   96,    0,   96,   99,    0,    0,    0,    0,   96,
-   96,   96,   96,    0,    0,    0,    0,    0,    0,  153,
-   96,   96,  153,   96,   96,   96,   96,   96,   96,   96,
-  101,    0,    0,  101,   99,    0,  153,  153,    0,    0,
-    0,  153,    0,    0,    0,    0,    0,  101,  101,    0,
-    0,    0,  101,    0,    0,    0,    0,   97,   97,   97,
-   97,    0,    0,    0,   97,    0,   97,    0,    0,    0,
-    0,  153,   97,   97,   97,   97,  152,    0,    0,  152,
-    0,    0,  101,   97,   97,    0,   97,   97,   97,   97,
-   97,   97,    0,  152,  152,    0,    0,    0,  152,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,   98,   98,
-   98,   98,    0,    0,    0,   98,    0,   98,    0,    0,
-    0,    0,    0,   98,   98,    0,   98,  141,  152,    0,
-  141,    0,    0,    0,   98,   98,    0,   98,   98,   98,
-   98,   98,   98,    0,  141,  141,    0,    0,    0,  141,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  118,    0,    0,  118,    0,
-    0,    0,    0,    0,    0,  102,    0,    0,  102,  141,
-    0,    0,  118,  118,    0,    0,    0,  118,    0,    0,
-    0,    0,  102,  102,    0,    0,    0,  102,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   99,   99,   99,   99,  118,    0,    0,
-   99,    0,   99,    0,    0,    0,    0,  102,   99,   99,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   99,
-   99,    0,   99,   99,   99,   99,   99,   99,    0,    0,
-  153,  153,  153,  153,    0,    0,    0,  153,    0,  153,
-    0,  101,  101,  101,  101,  153,  153,    0,  101,    0,
-  101,    0,    0,    0,    0,    0,  153,  153,    0,  153,
-  153,  153,  153,  153,    0,    0,    0,  101,  101,    0,
-  101,  101,  101,  101,  101,  103,    0,    0,  103,    0,
-    0,    0,    0,    0,    0,    0,    0,  152,  152,  152,
-  152,    0,  103,  103,  152,    0,  152,  103,    0,    0,
-    0,    0,  152,  152,    0,    0,    0,    0,  105,    0,
-    0,  105,    0,  152,  152,    0,  152,  152,  152,  152,
-  152,    0,    0,    0,    0,  105,  105,  103,    0,    0,
-  105,    0,    0,    0,    0,    0,    0,    0,  141,  141,
-  141,  141,    0,    0,    0,  141,    0,  141,    0,    0,
-    0,    0,    0,  141,  141,    0,    0,    0,    0,    0,
-  105,    0,    0,    0,  141,  141,    0,  141,  141,  141,
-  141,  141,    0,    0,    0,    0,  118,  118,  118,  118,
-    0,    0,    0,  118,    0,  118,  102,  102,  102,  102,
-    0,  118,  118,  102,    0,  102,    0,    0,    0,    0,
-    0,    0,  118,  118,    0,  118,  118,  118,  118,  118,
-    0,  106,  102,  102,  106,  102,  102,  102,  102,  102,
-    0,    0,    0,    0,    0,    0,    0,    0,  106,  106,
-   95,    0,    0,  106,    0,    0,    0,    0,  105,    0,
-    0,    0,  110,    0,    0,  119,    0,    0,    0,    0,
-    0,    0,  126,  127,  128,  129,  130,    0,    0,    0,
-  135,  136,    0,  106,    0,    0,  141,    0,    0,    0,
+    0,    0,    0,   66,    0,   56,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,   27,   28,   29,
+   30,   31,    0,   32,   33,   34,    0,    0,    0,   35,
+   61,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   41,    0,   42,   43,   44,   45,   46,    0,    0,    0,
+    0,   47,   48,   49,   50,   51,   52,    0,    0,    0,
+    0,    0,   54,    0,    0,   56,    0,    0,    0,    0,
+    0,   57,    0,   58,   59,    0,    0,   27,   28,   29,
+   30,   31,    0,   32,   33,   34,    0,   55,    0,   35,
+   65,   67,   53,    0,   60,  298,   68,   64,    0,   63,
+   41,    0,   42,   43,   44,   45,   46,    0,    0,    0,
+    0,   47,   48,   49,   50,   51,   52,    0,   66,    0,
+    0,    0,   54,  108,  108,  108,  108,    0,    0,    0,
+  108,   57,  108,   58,   59,   25,   27,   28,   29,   30,
+   31,    0,   32,   33,   34,   61,    0,    0,   35,    0,
+    0,  108,  108,    0,  108,  108,  108,  108,  108,   41,
+    0,   42,   43,   44,   45,   46,    0,    0,    0,    0,
+   47,   48,   49,   50,   51,   52,    0,    0,    0,   55,
+   56,   54,   65,   67,   53,    0,   60,  307,   68,   64,
+   57,   63,   58,   59,    0,    0,   27,   28,   29,   30,
+   31,    0,   32,   33,   34,    0,    0,    0,   35,    0,
+   66,    0,    0,    0,    0,    0,    0,    0,    0,   41,
+    0,   42,   43,   44,   45,   46,    0,    0,    0,    0,
+   47,   48,   49,   50,   51,   52,    0,   61,    0,   55,
+    0,   54,   65,   67,   53,    0,   60,    0,   68,   64,
+   57,   63,   58,   59,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   95,   95,
+   66,    0,   56,    0,    0,    0,    0,    0,  158,    0,
+  108,  158,    0,    0,    0,    0,  116,   95,  124,    0,
+    0,    0,  130,   95,    0,  158,  158,   61,    0,    0,
+  158,    0,    0,    0,    0,   95,   95,   95,   95,    0,
+    0,   27,   28,   29,   30,   31,    0,   32,   33,   34,
+    0,    0,    0,   35,    0,   74,    0,    0,   74,    0,
+  158,    0,   56,    0,   41,    0,   42,   43,   44,   45,
+   46,  178,    0,   74,  178,   47,   48,   49,   50,   51,
+   52,    0,  116,    0,    0,    0,   54,    0,  178,  178,
+    0,    0,    0,  178,    0,   57,    0,   58,   59,    0,
+    0,    0,    0,    0,    0,    0,    0,   74,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  178,    0,  139,    0,    0,  139,    0,
+    0,    0,    0,   27,   28,   29,   30,   31,    0,   32,
+   33,   34,  139,  139,    0,   35,  252,  139,    0,    0,
+    0,    0,    0,    0,    0,    0,   41,    0,   42,   43,
+   44,   45,   46,    0,    0,    0,    0,   47,   48,   49,
+   50,   51,   52,  284,    0,    0,    0,  139,   54,    0,
+    0,    0,    0,    0,    0,  134,    0,   57,  134,   58,
+   59,    0,    0,   27,   28,   29,   30,   31,    0,   32,
+   33,   34,  134,  134,    0,   35,    0,  134,    0,    0,
+    0,    0,    0,    0,    0,    0,   41,    0,   42,   43,
+   44,   45,   46,    0,    0,    0,    0,   47,   48,   49,
+   50,   51,   52,    0,    0,    0,    0,  134,   54,  158,
+  158,  158,  158,    0,    0,    0,  158,   57,  158,   58,
+   59,    0,    0,    0,  158,  158,  158,  158,    0,    0,
+    0,    0,    0,  137,    0,    0,  137,  158,  158,    0,
+  158,  158,  158,  158,  158,  158,  158,    0,    0,  158,
+  137,  137,  158,  158,  158,  137,   74,   74,   74,   74,
+    0,    0,    0,   74,    0,    0,    0,    0,    0,    0,
+    0,    0,  178,  178,  178,  178,    0,    0,    0,  178,
+  135,  178,    0,  135,   74,  137,    0,  178,  178,  178,
+  178,    0,    0,    0,    0,    0,    0,  135,  135,    0,
+  178,  178,  135,  178,  178,  178,  178,  178,  178,  178,
+    0,    0,  178,    0,    0,  178,  178,  178,    0,    0,
+    0,    0,    0,    0,    0,    0,  139,  139,  139,  139,
+    0,  145,  135,  139,  145,  139,    0,    0,    0,    0,
+    0,  139,  139,  139,  139,    0,    0,    0,  145,  145,
+    0,    0,    0,  145,  139,  139,    0,  139,  139,  139,
+  139,  139,  139,  139,    0,    0,  139,    0,    0,  139,
+  139,  139,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  156,  145,    0,  156,  134,  134,  134,  134,
+    0,  169,    0,  134,  169,  134,    0,    0,    0,  156,
+  156,  134,  134,  134,  134,    0,    0,    0,  169,  169,
+    0,    0,    0,  169,  134,  134,    0,  134,  134,  134,
+  134,  134,  134,  134,    0,    0,  134,    0,    0,  134,
+  134,  134,    0,    0,  156,    0,    0,  172,    0,    0,
+  172,    0,    0,  169,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,  172,  172,    0,    0,    0,  172,
+    0,    0,    0,    0,  137,  137,  137,  137,    0,    0,
+    0,  137,    0,  137,    0,    0,    0,    0,    0,  137,
+  137,  137,  137,    0,    0,    0,    0,    0,    0,  172,
+    0,    0,  137,  137,    0,  137,  137,  137,  137,  137,
+  137,  137,    0,    0,  137,    0,    0,  137,  137,  137,
+    0,  135,  135,  135,  135,    0,  128,    0,  135,  128,
+  135,    0,    0,    0,    0,    0,  135,  135,  135,  135,
+    0,    0,    0,  128,  128,    0,    0,    0,  128,  135,
+  135,    0,  135,  135,  135,  135,  135,  135,  135,    0,
+    0,  135,    0,    0,  135,  135,  135,    0,    0,    0,
+    0,    0,  145,  145,  145,  145,    0,   76,  128,  145,
+   76,  145,    0,    0,    0,    0,    0,  145,  145,  145,
+  145,    0,    0,    0,   76,   76,    0,    0,    0,   76,
+  145,  145,    0,  145,  145,  145,  145,  145,  145,  145,
+    0,    0,  145,    0,    0,  145,  145,  145,    0,    0,
+    0,    0,    0,  156,  156,  156,  156,    0,    0,   76,
+  156,    0,  169,  169,  169,  169,    0,   66,    0,  169,
+   66,  169,    0,    0,    0,    0,    0,  169,  169,  169,
+  169,  156,  156,    0,   66,   66,    0,    0,    0,   66,
+  169,  169,    0,  169,  169,  169,  169,  169,  169,  169,
+    0,    0,  169,    0,    0,  169,  169,  169,  172,  172,
+  172,  172,    0,  127,    0,  172,  127,  172,    0,   66,
+    0,    0,    0,  172,  172,  172,  172,    0,    0,    0,
+  127,  127,    0,    0,    0,  127,  172,  172,    0,  172,
+  172,  172,  172,  172,  172,  172,    0,    0,  172,    0,
+    0,  172,  172,  172,    0,    0,    0,    0,    0,   82,
+    0,    0,   82,    0,    0,  127,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   82,   82,    0,    0,
+    0,   82,  114,    0,    0,  114,    0,  128,  128,  128,
+  128,    0,    0,    0,  128,    0,  128,    0,    0,  114,
+  114,    0,  128,  128,  128,  128,    0,    0,    0,    0,
+    0,   82,    0,    0,    0,  128,  128,    0,  128,  128,
+  128,  128,  128,  128,  128,    0,    0,  128,    0,    0,
+  128,  128,  128,  102,  114,    0,  102,    0,   76,   76,
+   76,   76,  179,    0,    0,   76,    0,   76,    0,    0,
+  102,  102,    0,   76,   76,   76,   76,    0,    0,  179,
+  179,    0,    0,    0,  179,    0,   76,   76,    0,   76,
+   76,   76,   76,   76,   76,   76,    0,    0,   76,    0,
+    0,   76,   76,   76,    0,  102,    0,    0,    0,    0,
+    0,    0,    0,    0,  179,    0,    0,    0,   66,   66,
+   66,   66,  157,    0,    0,   66,    0,   66,    0,    0,
+    0,    0,    0,   66,   66,   66,   66,    0,    0,  157,
+  157,    0,    0,    0,  157,    0,   66,   66,    0,   66,
+   66,   66,   66,   66,   66,   66,    0,    0,   66,    0,
+    0,   66,   66,   66,  127,  127,  127,  127,   79,    0,
+    0,  127,    0,  127,  157,    0,    0,    0,    0,  127,
+  127,  127,  127,    0,    0,   79,   79,    0,    0,    0,
+   79,    0,  127,  127,    0,  127,  127,  127,  127,  127,
+  127,  127,    0,    0,  127,    0,    0,  127,  127,  127,
+   82,   82,   82,   82,    0,    0,    0,   82,    0,   82,
+   79,    0,    0,    0,    0,   82,   82,   82,   82,    0,
+    0,    0,    0,  114,  114,  114,  114,    0,   82,   82,
+  114,   82,   82,   82,   82,   82,   82,   82,    0,  123,
+   82,    0,  123,   82,   82,   82,    0,    0,    0,    0,
+    0,  114,  114,    0,  114,    0,  123,  123,    0,    0,
+    0,  123,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,  102,  102,  102,  102,    0,    0,
+    0,  102,    0,  179,  179,  179,  179,    0,    0,    0,
+  179,  123,  179,    0,    0,    0,    0,    0,  179,  179,
+  179,  179,  102,  102,    0,    0,    0,    0,    0,    0,
+    0,  179,  179,    0,  179,  179,  179,  179,  179,  179,
+  179,    0,    0,  179,    0,    0,  179,  179,  179,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,  186,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  103,  103,  103,  103,
-    0,    0,    0,  103,    0,  103,    0,    0,    0,    0,
+    0,    0,    0,  157,  157,  157,  157,    0,    0,    0,
+  157,  124,  157,    0,  124,    0,    0,    0,  157,  157,
+  157,  157,    0,    0,    0,    0,    0,    0,  124,  124,
+    0,  157,  157,  124,  157,  157,  157,  157,  157,  157,
+  157,    0,    0,  157,    0,    0,  157,  157,  157,   79,
+   79,   79,   79,    0,  118,    0,   79,  118,   79,    0,
+    0,    0,    0,  124,   79,   79,   79,   79,    0,    0,
+    0,  118,  118,    0,    0,    0,  118,   79,   79,    0,
+   79,   79,   79,   79,   79,   79,   79,   99,    0,   79,
+    0,    0,   79,   79,   79,  109,    0,    0,  119,  114,
+    0,  119,  123,    0,    0,  128,  118,    0,    0,  136,
+  137,  138,  139,  140,    0,  119,  119,  145,  146,    0,
+  119,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  123,  123,  123,  123,    0,    0,    0,  123,  120,  123,
+    0,  120,    0,    0,    0,  123,  123,  123,  123,    0,
+  119,    0,  196,    0,    0,  120,  120,    0,  123,  123,
+  120,  123,  123,  123,  123,  123,  123,  123,    0,    0,
+  123,    0,    0,    0,    0,    0,  116,    0,    0,  116,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  103,  103,    0,  103,  103,  103,  103,  105,
-  105,  105,  105,    0,    0,    0,  105,    0,  105,    0,
-    0,  220,  221,  222,  223,  224,  225,  226,  227,  228,
-  229,  230,  231,  232,  233,  105,  105,    0,  105,  105,
-  105,    0,    0,    0,    0,    0,    0,    0,  251,    0,
+  120,    0,    0,  116,  116,    0,    0,    0,  116,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,  234,  235,  236,  237,  238,  239,
+  240,  241,  242,  243,  244,  245,  246,  247,  116,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  265,  124,  124,  124,  124,    0,  117,    0,  124,
+  117,  124,    0,    0,    0,    0,    0,  124,  124,  124,
+  124,    0,    0,    0,  117,  117,    0,    0,    0,  117,
+  124,  124,    0,  124,  124,  124,  124,  124,  124,  124,
+    0,    0,  124,    0,    0,  118,  118,  118,  118,    0,
+  115,    0,  118,  115,  118,    0,    0,    0,    0,  117,
+  118,  118,  118,  118,    0,    0,    0,  115,  115,    0,
+    0,    0,  115,  118,  118,    0,  118,  118,  118,  118,
+  118,  118,  118,    0,    0,    0,  327,    0,    0,  119,
+  119,  119,  119,    0,    0,    0,  119,   77,  119,    0,
+   77,    0,  115,    0,  119,  119,  119,  119,    0,    0,
+    0,    0,    0,    0,   77,   77,    0,  119,  119,  343,
+  119,  119,  119,  119,  119,  119,  119,    0,    0,  120,
+  120,  120,  120,    0,  103,    0,  120,  103,  120,    0,
+    0,    0,    0,    0,  120,  120,  120,  120,    0,   77,
+    0,  103,  103,    0,    0,    0,  103,  120,  120,    0,
+  120,  120,  120,  120,  120,  120,  120,  116,  116,  116,
+  116,    0,  104,    0,  116,  104,  116,    0,    0,    0,
+    0,    0,  116,  116,  116,  116,  103,    0,    0,  104,
+  104,    0,    0,    0,  104,  116,  116,    0,  116,  116,
+  116,  116,  116,  116,  116,    0,    0,    0,    0,  105,
+    0,    0,  105,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,  104,    0,  105,  105,    0,    0,
+    0,  105,    0,    0,    0,    0,    0,    0,  117,  117,
+  117,  117,    0,    0,    0,  117,    0,  117,    0,    0,
+    0,    0,    0,  117,  117,  117,  117,  305,    0,    0,
+    0,  105,  166,    0,    0,    0,  117,  117,    0,  117,
+  117,  117,  117,  117,  117,  117,    0,    0,    0,    0,
+    0,  115,  115,  115,  115,    0,  161,    0,  115,  161,
+  115,    0,    0,    0,    0,    0,  115,  115,  115,  115,
+    0,    0,    0,  161,  161,    0,    0,    0,  161,  115,
+  115,    0,  115,  115,  115,  115,  115,  115,  115,    0,
+    0,    0,    0,  160,    0,    0,  160,    0,   77,   77,
+   77,   77,    0,  149,    0,   77,  149,    0,  161,    0,
+  160,  160,    0,    0,    0,  160,    0,    0,    0,    0,
+  149,  149,    0,    0,    0,  149,   77,   77,    0,    0,
+    0,    0,    0,    0,    0,  103,  103,  103,  103,    0,
+  126,    0,  103,  126,  103,  160,    0,    0,    0,    0,
+  103,  103,  103,  103,    0,  149,    0,  126,  126,    0,
+    0,    0,  126,  103,  103,    0,  103,  103,  103,  103,
+  103,  103,  103,  104,  104,  104,  104,    0,  107,    0,
+  104,  107,  104,    0,    0,    0,    0,    0,  104,  104,
+  104,  104,  126,    0,    0,  107,  107,    0,    0,    0,
+  107,  104,  104,    0,  104,  104,  104,  104,  104,  104,
+  105,  105,  105,  105,    0,  109,    0,  105,  109,  105,
+    0,    0,    0,    0,    0,  105,  105,    0,  105,    0,
+  107,  110,  109,  109,  110,    0,    0,  109,  105,  105,
+    0,  105,  105,  105,  105,  105,  105,    0,  110,  110,
+  160,    0,    0,  110,    0,    0,  161,  162,  163,  164,
+    0,    0,    0,    0,    0,    0,    0,  109,    0,    0,
+    0,    0,  165,  167,  168,  169,  170,  171,  172,    0,
+    0,  173,    0,  110,  174,  175,  176,  161,  161,  161,
+  161,    0,  112,    0,  161,  112,  161,    0,    0,    0,
+    0,    0,  161,  161,    0,    0,    0,    0,    0,  112,
+  112,    0,    0,    0,  112,  161,  161,    0,  161,  161,
+  161,  161,  161,    0,  160,  160,  160,  160,    0,  113,
+    0,  160,  113,  160,  149,  149,  149,  149,    0,  160,
+  160,  149,    0,  149,  112,    0,  113,  113,    0,  149,
+  149,  113,  160,  160,    0,  160,  160,  160,  160,  160,
+    0,    0,  149,  149,    0,  149,  149,  149,  149,  149,
+    0,  126,  126,  126,  126,    0,    0,    0,  126,    0,
+  126,  113,    0,    0,    0,    0,  126,  126,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,  126,
+  126,    0,  126,  126,  126,  126,  126,    0,    0,  107,
+  107,  107,  107,    0,    0,    0,  107,    0,  107,    0,
+    0,    0,    0,    0,    0,  107,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  107,  107,    0,
+  107,  107,  107,  107,  107,    0,  109,  109,  109,  109,
+    0,    0,    0,  109,    0,  109,    0,    0,    0,    0,
+    0,    0,  110,  110,  110,  110,    0,    0,    0,  110,
+    0,  110,    0,    0,  109,  109,    0,  109,  109,  109,
+  109,  109,    0,    0,    0,    0,    0,    0,    0,    0,
+  110,  110,    0,  110,  110,  110,  110,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  112,  112,  112,  112,    0,    0,    0,
+  112,    0,  112,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  112,  112,    0,  112,  112,  112,    0,    0,    0,
+  113,  113,  113,  113,    0,    0,    0,  113,    0,  113,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  106,  106,  106,  106,    0,    0,    0,  106,
-    0,  106,    0,    0,    0,    0,    0,    0,  306,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,  106,  106,
-    0,  106,  106,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,  321,
+    0,    0,    0,    0,    0,    0,    0,    0,  113,  113,
+    0,  113,  113,
 };
-static short yycheck[] = {                               13,
-   59,   59,   59,   36,   43,  185,   92,   40,   87,   59,
-   91,   36,   51,   41,   59,  336,   44,  257,   41,   40,
-   91,   41,   41,   40,   44,  298,  299,  257,   41,   93,
-   58,   59,   46,   59,   40,   63,   41,  123,   58,   59,
-   59,   41,  123,   57,   58,   40,  367,   41,   59,   41,
-   41,   41,  123,   92,   59,  194,   41,   41,  257,   41,
-  278,   41,  123,   41,   41,   93,   44,   40,   59,   59,
-   91,  276,  277,   93,   91,   59,  115,   41,  123,   44,
-   58,   59,   59,   40,  123,   63,   98,   99,  100,  101,
-  102,  103,   41,  107,  108,   59,   40,  123,  123,  289,
-  290,   59,  123,   59,    0,   59,  123,   40,   40,   36,
-   59,   40,   40,   40,  294,   93,  306,  307,   44,   59,
-  310,  123,  260,  313,  314,  315,  257,   40,   40,   40,
-  144,  145,  146,  147,  148,  149,  150,   33,  277,   41,
-   36,   37,   38,   93,   40,  315,   42,   43,   93,   45,
-   93,  125,   93,   91,  168,  169,  170,  171,  172,  173,
-  174,  175,  176,   59,   91,  257,   36,    0,   64,  255,
-   41,  185,  125,  312,  260,  189,  190,   91,  192,  299,
-  194,   41,   40,  195,   41,   41,   93,  201,   93,  203,
-  204,   41,  333,  334,  208,   91,  123,  338,   41,  257,
-   33,   40,  125,   36,   37,   38,   41,   40,   59,   42,
-   43,   59,   45,  354,  123,  125,  255,  358,  357,  125,
-  234,  260,  236,  237,    0,  125,   59,  123,   41,  125,
-  126,   64,  257,  125,  298,  299,   41,  262,   41,  298,
-  299,  298,  299,   59,  272,  273,  274,  275,  298,  299,
-   40,  279,  272,  273,  274,  275,   41,   33,   91,  279,
-   36,   37,   38,  296,   40,  344,   42,   43,   41,   45,
-  298,  299,   41,  301,  288,  298,  299,  123,  298,  299,
-  294,  301,   41,   59,   59,  298,  299,  123,   64,   41,
-  123,   59,  125,  126,  272,  273,  274,  275,  298,  299,
-  314,  279,   41,  281,  298,  299,  298,  299,   41,  287,
-  288,  289,  290,  298,  299,   91,  298,  299,  298,  299,
-  298,  299,   59,  301,  302,  303,  304,  305,  306,  307,
-   63,  258,  310,  298,  299,  313,  314,  315,   41,  353,
-  298,  299,  298,  299,  298,  299,    8,  123,  298,  299,
-  126,   32,   13,  298,  299,  298,  299,  298,  299,  145,
-  256,  257,  258,  259,  260,  261,  353,  263,  264,  265,
+static short yycheck[] = {                                      15,
+   36,   91,   41,   36,   40,   59,   59,   41,  195,   41,
+   59,   59,   41,   59,   59,   44,   59,  123,   93,   36,
+   93,  358,   59,   40,   96,   91,   40,   91,   41,   58,
+   59,   41,   41,   49,   63,   59,   41,   59,   41,  257,
+  204,   40,  192,   90,   60,   61,   59,   41,  198,  257,
+   59,   15,  389,   41,  101,  127,   59,  123,   41,  123,
+  289,  290,  300,  301,   93,   59,  266,  267,  268,   41,
+  270,  271,   41,   41,   91,  123,   41,   91,  123,   44,
+  309,   45,   41,  312,   48,   93,  315,  316,  317,   44,
+  123,   59,   91,   58,   59,  111,  112,  297,   63,  123,
+   59,  123,   59,   36,   37,   40,  123,   40,   40,  123,
+  257,   41,   59,  129,    0,  102,  103,  104,  105,  106,
+  107,   85,   40,  310,  123,  278,   41,  291,   93,   59,
+  312,   64,   40,  315,  316,  317,  100,  153,  154,  155,
+  156,  157,  158,  159,   59,  276,  277,   33,   93,   40,
+   36,   37,   38,   93,   40,   93,   42,   43,   40,   45,
+   40,  177,  178,  179,  180,  181,  182,  183,  184,  185,
+  334,    8,    9,   59,    0,   40,   40,  123,   64,  195,
+   59,   44,  123,  199,  200,   40,  202,  151,  204,  260,
+  257,   40,  298,   41,   93,  211,  268,  213,  214,   40,
+  125,  298,  274,  257,  317,   91,  222,   33,   36,  298,
+   36,   37,   38,   91,   40,  379,   42,   43,  205,   45,
+   41,  125,  257,   91,  257,  300,  301,  300,  301,  262,
+  260,  301,  248,   59,  250,  251,   40,  123,   64,  125,
+  126,  258,    0,  272,  273,  274,  275,  300,  301,  260,
+  279,  300,  301,  298,  300,  301,   41,  300,  301,   41,
+  296,  300,  301,  300,  301,   91,  300,  301,  300,  301,
+   41,  300,  301,   41,  303,   33,  366,   41,   36,   37,
+   38,   40,   40,   59,   42,   43,   41,   45,  304,  125,
+  300,  301,  300,  301,  310,  300,  301,  123,  125,  125,
+  126,   59,  125,  267,  123,  269,   64,  272,  273,  274,
+  275,  275,  300,  301,  279,  125,  281,  300,  301,   59,
+  336,   41,  287,  288,  289,  290,  125,   41,  300,  301,
+   44,  300,  301,   91,   41,  300,  301,   41,  303,  304,
+  305,  306,  307,  308,  309,  300,  301,  312,   59,   63,
+  315,  316,  317,  300,  301,  300,  301,   40,  123,  375,
+  300,  301,  300,  301,   41,  123,   41,   41,  126,  123,
+  256,  257,  258,  259,  260,  261,   41,  263,  264,  265,
+  266,  267,  268,  269,  270,  271,  272,  273,  274,  275,
+   41,   59,   41,  279,  280,  289,  282,  283,  284,  285,
+  286,  300,  301,   59,   41,  291,  292,  293,  294,  295,
+  296,  297,   63,   59,   41,  309,  302,   35,  312,   52,
+   52,  315,  316,  317,   15,  311,  154,  313,  314,  336,
+  256,  257,  258,  259,  260,  261,  375,  263,  264,  265,
   266,  267,  268,  269,  270,  271,  272,  273,  274,  275,
-  125,  192,   97,  279,  280,   -1,  282,  283,  284,  285,
-  286,  298,  299,  298,  299,  291,  292,  293,  294,  295,
-  296,   -1,   -1,   41,  300,   -1,   44,  266,  267,  268,
-  314,  270,  271,  309,   -1,  311,  312,   -1,   -1,   -1,
-   -1,   59,   -1,  256,  257,  258,  259,  260,  261,   -1,
-  263,  264,  265,  266,  267,  268,  269,  270,  271,  272,
-  273,  274,  275,  125,   -1,   -1,  279,  280,  289,  282,
-  283,  284,  285,  286,   -1,   93,   -1,   -1,  291,  292,
-  293,  294,  295,  296,   -1,   -1,  307,  300,   41,  310,
-   -1,   44,  313,  314,  315,   -1,  309,   -1,  311,  312,
-  256,  257,  258,  259,  260,  261,   -1,  263,  264,  265,
-   63,   -1,   -1,  269,   -1,   -1,  272,  273,  274,  275,
-   -1,   -1,   -1,  279,  280,   -1,  282,  283,  284,  285,
-  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,
-  296,  266,  267,  268,  300,  270,  271,  310,   -1,   -1,
-  313,  314,  315,  309,   33,  311,  312,   36,   37,   38,
-   -1,   40,   41,   42,   43,   44,   45,   -1,  281,   -1,
-   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,   58,
-   59,   -1,   -1,   -1,   63,   64,   -1,   -1,  301,  302,
-  303,  304,  305,  306,  307,   -1,   -1,  310,   -1,   -1,
-  313,  314,  315,   -1,  266,  267,  268,   -1,  270,  271,
-   -1,   -1,   91,   33,   93,   -1,   36,   37,   38,   -1,
-   40,   41,   42,   43,   44,   45,   -1,   -1,   26,   -1,
-   -1,   -1,   -1,  272,  273,  274,  275,   -1,   58,   59,
-  279,   -1,   -1,   63,   64,   43,   44,  126,   -1,   -1,
-   -1,   -1,   50,   -1,  272,  273,  274,  275,   -1,  298,
-  299,  279,   -1,   -1,   62,   63,   64,   65,   -1,   -1,
-   -1,   -1,   -1,   93,   33,   -1,   -1,   36,   37,   38,
-  298,   40,   -1,   42,   43,   -1,   45,   -1,  309,  310,
-  311,   -1,  313,   -1,   -1,  287,  288,  289,  290,   -1,
-   59,  307,   -1,   -1,  310,   64,  126,  313,  314,  315,
-  108,  303,  304,  305,  306,  307,   -1,   -1,  310,  340,
-   -1,  313,  314,  315,   41,   -1,  347,   44,  281,   -1,
-  351,   -1,   91,   -1,  287,  288,  289,  290,   -1,   -1,
-   -1,   58,   59,  364,  365,   -1,   63,   -1,  301,  302,
-  303,  304,  305,  306,  307,   -1,   -1,  310,   -1,   -1,
-  313,  314,  315,   -1,  123,   -1,   -1,  126,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   93,   -1,  257,  258,
+  202,   24,  269,  279,  280,   -1,  282,  283,  284,  285,
+  286,   -1,   -1,  125,   -1,  291,  292,  293,  294,  295,
+  296,  297,  355,  356,   -1,  309,  302,  360,  312,   -1,
+   -1,  315,  316,  317,   -1,  311,   -1,  313,  314,   -1,
+   -1,   41,   -1,  376,   44,   -1,   -1,  380,  256,  257,
+  258,  259,  260,  261,   -1,  263,  264,  265,   58,   59,
+   -1,  269,   -1,   63,  272,  273,  274,  275,   -1,   -1,
+   -1,  279,  280,   -1,  282,  283,  284,  285,  286,   -1,
+   -1,  125,   -1,  291,  292,  293,  294,  295,  296,   -1,
+   -1,   -1,   -1,   93,  302,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  311,   33,  313,  314,   36,   37,   38,
+   -1,   40,   41,   42,   43,   44,   45,  281,   -1,   -1,
+   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,   58,
+   59,   -1,   -1,   -1,   63,   64,   -1,   -1,   -1,  303,
+  304,  305,  306,  307,  308,  309,   -1,   -1,  312,   -1,
+   -1,  315,  316,  317,  266,  267,  268,   -1,  270,  271,
+   -1,   -1,   91,   -1,   93,   33,   -1,   -1,   36,   37,
+   38,   -1,   40,   41,   42,   43,   44,   45,   -1,   -1,
+  281,   -1,   -1,   -1,   -1,  297,  287,  288,  289,  290,
+   58,   59,   -1,   -1,   -1,   63,   64,  126,   -1,   -1,
+   -1,   -1,  303,  304,  305,  306,  307,  308,  309,   -1,
+   -1,  312,   29,   -1,  315,  316,  317,   -1,   -1,   -1,
+   -1,   -1,  266,  267,  268,   93,  270,  271,   33,   46,
+   47,   36,   37,   38,   -1,   40,   53,   42,   43,   -1,
+   45,  287,  288,  289,  290,   -1,   -1,   -1,   65,   66,
+   67,   68,   -1,  297,   59,   -1,   -1,   -1,  126,   64,
+  306,  307,  308,  309,   -1,   -1,  312,   -1,   -1,  315,
+  316,  317,  272,  273,  274,  275,   -1,   -1,   -1,  279,
+   -1,  281,   -1,   -1,   -1,   -1,   91,  287,  288,  289,
+  290,  272,  273,  274,  275,  112,   -1,   -1,  279,   -1,
+  300,  301,   -1,  303,  304,  305,  306,  307,  308,  309,
+   -1,   -1,  312,   -1,   -1,  315,  316,  317,  123,  300,
+  301,  126,   -1,   -1,   -1,   -1,   -1,   -1,  257,  258,
   259,  260,  261,   -1,  263,  264,  265,   -1,   -1,   -1,
-  269,   -1,   58,  272,  273,  274,  275,   63,   -1,   -1,
-  279,  280,  281,  282,  283,  284,  285,  286,  287,  288,
-  289,  290,  291,  292,  293,  294,  295,  296,   -1,  298,
-  299,  300,  301,  302,  303,  304,  305,  306,  307,   -1,
-  309,  310,  311,  312,  313,  314,  315,  257,  258,  259,
-  260,  261,   -1,  263,  264,  265,   -1,   -1,   -1,  269,
-   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,  279,
-  280,  281,  282,  283,  284,  285,  286,  287,  288,  289,
-  290,  291,  292,  293,  294,  295,  296,   -1,  298,  299,
-  300,  301,  302,  303,  304,  305,  306,  307,   -1,  309,
-  310,  311,  312,  313,  314,  315,   -1,  256,  257,  258,
-  259,  260,  261,   -1,  263,  264,  265,   -1,   -1,   63,
   269,   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,
-  279,  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,
-   -1,   -1,  291,  292,  293,  294,  295,  296,   -1,   33,
-   -1,  300,   36,   37,   38,   13,   40,   -1,   42,   43,
-  309,   45,  311,  312,   -1,  272,  273,  274,  275,   -1,
-   -1,   -1,  279,   -1,  281,   59,   -1,   -1,   -1,   -1,
-   64,  288,   -1,   -1,   42,   -1,   -1,   45,   41,   -1,
-   -1,  298,  299,   -1,  301,  302,  303,  304,  305,   -1,
-  287,  288,  289,  290,   -1,   33,   59,   91,   36,   37,
-   38,   -1,   40,   -1,   42,   43,   -1,   45,  305,  306,
-  307,   -1,   -1,  310,   82,  281,  313,  314,  315,   -1,
-   -1,  287,  288,  289,  290,   -1,   64,   -1,   96,  123,
-   93,   -1,  126,   -1,   -1,  301,  302,  303,  304,  305,
-  306,  307,   -1,   -1,  310,   -1,   -1,  313,  314,  315,
-   -1,   33,   -1,   91,   36,   37,   38,   -1,   40,   -1,
-   42,   43,   -1,   45,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  142,   -1,   -1,  287,  288,  289,
-  290,   -1,   64,   -1,   -1,  123,   -1,   -1,  126,   -1,
-   41,   -1,   -1,   44,  304,  305,  306,  307,   -1,   -1,
-  310,   -1,   -1,  313,  314,  315,   -1,   58,   59,   91,
-   -1,   -1,   -1,  181,   33,   -1,   -1,   36,   37,   38,
-  188,   40,   -1,   42,   43,   -1,   45,  281,   -1,   -1,
-   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,   -1,
-   -1,  123,   93,   -1,  126,   64,   -1,  301,  302,  303,
-  304,  305,  306,  307,   -1,   -1,  310,   -1,   -1,  313,
-  314,  315,  256,  257,  258,  259,  260,  261,   -1,  263,
-  264,  265,   91,   -1,   -1,  269,   -1,   -1,  272,  273,
-  274,  275,   -1,   -1,   -1,  279,  280,   -1,  282,  283,
-  284,  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,
-  294,  295,  296,   -1,  123,   -1,  300,  126,   -1,  272,
-  273,  274,  275,   -1,   -1,  309,  279,  311,  312,  257,
-  258,  259,  260,  261,  262,  263,  264,  265,   -1,   -1,
-   -1,  269,   -1,   -1,   63,  298,  299,   -1,   -1,   -1,
-   -1,   -1,  280,   -1,  282,  283,  284,  285,  286,   -1,
-   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,   -1,
-   -1,   -1,  300,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  309,   -1,  311,  312,  257,  258,  259,  260,  261,
-   -1,  263,  264,  265,   -1,   33,   -1,  269,   36,   37,
-   38,   -1,   40,   41,   42,   43,   -1,   45,  280,   -1,
-  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,  291,
-  292,  293,  294,  295,  296,   -1,   64,   -1,  300,   -1,
-   -1,  272,  273,  274,  275,   -1,   -1,  309,  279,  311,
-  312,   -1,  287,  288,  289,  290,   -1,   -1,  257,  258,
-  259,  260,  261,   91,  263,  264,  265,  298,  299,   -1,
-  269,  306,  307,   -1,   -1,  310,   -1,   -1,  313,  314,
-  315,  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,
-   -1,   -1,  291,  292,  293,  294,  295,  296,  126,   33,
-   -1,  300,   36,   37,   38,   -1,   40,   -1,   42,   43,
-  309,   45,  311,  312,  287,   -1,  289,  290,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   59,   -1,   -1,   -1,   -1,
-   64,   25,   26,  306,  307,   -1,   41,  310,   -1,   44,
-  313,  314,  315,   37,   -1,   -1,   -1,   -1,   -1,   43,
-   44,   45,   -1,   58,   59,   33,   50,   91,   36,   37,
-   38,   -1,   40,   -1,   42,   43,   -1,   45,   62,   63,
-   64,   65,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,
-  289,  290,   -1,   -1,   -1,   -1,   64,   -1,   93,   -1,
-   -1,   -1,  126,  302,  303,  304,  305,  306,  307,   -1,
-   -1,  310,   -1,   -1,  313,  314,  315,   -1,   -1,   -1,
-   -1,   -1,   -1,   91,  108,   93,   33,   -1,   -1,   36,
-   37,   38,   -1,   40,   41,   42,   43,   -1,   45,  257,
+  279,  280,  281,  282,  283,  284,  285,  286,  287,  288,
+  289,  290,  291,  292,  293,  294,  295,  296,   -1,   -1,
+   -1,  300,  301,  302,  303,  304,  305,  306,  307,  308,
+  309,   -1,  311,  312,  313,  314,  315,  316,  317,  257,
   258,  259,  260,  261,   -1,  263,  264,  265,   -1,   -1,
-   -1,  269,   -1,   -1,   -1,   -1,   -1,   64,  126,   -1,
+   -1,  269,   -1,   -1,  272,  273,  274,  275,   -1,   -1,
+   -1,  279,  280,  281,  282,  283,  284,  285,  286,  287,
+  288,  289,  290,  291,  292,  293,  294,  295,  296,   -1,
+   -1,   -1,  300,  301,  302,  303,  304,  305,  306,  307,
+  308,  309,   -1,  311,  312,  313,  314,  315,  316,  317,
+   -1,  256,  257,  258,  259,  260,  261,   63,  263,  264,
+  265,   -1,   -1,   -1,  269,   -1,   -1,  272,  273,  274,
+  275,   -1,   -1,   -1,  279,  280,   -1,  282,  283,  284,
+  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,
+  295,  296,   -1,   -1,   -1,   33,   -1,  302,   36,   37,
+   38,   -1,   40,   -1,   42,   43,  311,   45,  313,  314,
+   -1,   46,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   54,
+  287,   59,  289,  290,   -1,   -1,   64,   -1,   -1,   41,
+   -1,   -1,   44,   -1,   -1,  331,  332,  333,   -1,  335,
+   -1,  308,  309,   -1,   -1,  312,   58,   59,  315,  316,
+  317,   -1,   -1,   91,   -1,   33,   -1,   -1,   36,   37,
+   38,   96,   40,   -1,   42,   43,  362,   45,   -1,   -1,
+   -1,   -1,   -1,  369,   -1,   -1,   -1,  373,   -1,   -1,
+   -1,   93,   -1,   -1,  119,  123,   64,   -1,  126,   -1,
+  386,  387,  127,   -1,   -1,   33,   -1,   -1,   36,   37,
+   38,   -1,   40,   -1,   42,   43,   -1,   45,   -1,   -1,
+   -1,   -1,   -1,   91,  287,  288,  289,  290,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   64,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   41,  308,  309,   44,   -1,  312,
+   -1,   -1,  315,  316,  317,  123,   -1,   -1,  126,   -1,
+   -1,   58,   59,   91,   -1,   -1,   63,   -1,   -1,   33,
+   -1,   -1,   36,   37,   38,   -1,   40,   -1,   42,   43,
+   -1,   45,   -1,   -1,   -1,  281,   -1,   -1,   -1,   -1,
+   -1,  287,  288,  289,  290,  123,   93,   -1,  126,   -1,
+   64,   -1,   -1,   -1,   -1,   -1,   -1,  303,  304,  305,
+  306,  307,  308,  309,   -1,   -1,  312,   -1,   -1,  315,
+  316,  317,   -1,   -1,   -1,   -1,   -1,   91,  256,  257,
+  258,  259,  260,  261,   -1,  263,  264,  265,   -1,   -1,
+   -1,  269,   -1,  268,  272,  273,  274,  275,   -1,  274,
+   -1,  279,  280,   -1,  282,  283,  284,  285,  286,  123,
+   -1,   -1,  126,  291,  292,  293,  294,  295,  296,   -1,
+  272,  273,  274,  275,  302,   -1,   -1,  279,   -1,   -1,
+   -1,   -1,   -1,  311,   -1,  313,  314,   -1,   -1,  257,
+  258,  259,  260,  261,  262,  263,  264,  265,  300,  301,
+   -1,  269,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,  280,   -1,  282,  283,  284,  285,  286,   -1,
+   41,   -1,   -1,  291,  292,  293,  294,  295,  296,  257,
+  258,  259,  260,  261,  302,  263,  264,  265,   59,   -1,
+   -1,  269,   -1,  311,   -1,  313,  314,   -1,   -1,   -1,
+   -1,   -1,  280,   -1,  282,  283,  284,  285,  286,   63,
    -1,   -1,   -1,  291,  292,  293,  294,  295,  296,   -1,
-  289,  290,  300,  167,   91,   -1,   -1,   -1,   -1,   -1,
-   -1,  309,   -1,  311,  312,   -1,   -1,   41,  307,   -1,
-   44,  310,   -1,   -1,  313,  314,  315,   -1,   -1,  193,
-   -1,   -1,   -1,   -1,   58,   59,   -1,   33,   -1,  126,
-   36,   37,   38,   -1,   40,   41,   42,   43,   -1,   45,
-   -1,   -1,   -1,  257,  258,  259,  260,  261,   -1,  263,
-  264,  265,   -1,   -1,   -1,  269,   -1,   -1,   64,   93,
-   -1,   -1,   -1,   -1,   -1,   -1,  280,   -1,  282,  283,
+   -1,   -1,   93,   -1,  302,  272,  273,  274,  275,   -1,
+   -1,   -1,  279,  311,  281,  313,  314,   -1,   -1,   -1,
+  287,  288,   -1,  257,  258,  259,  260,  261,   -1,  263,
+  264,  265,   -1,  300,  301,  269,  303,  304,  305,  306,
+  307,  308,   -1,   -1,   -1,   -1,  280,   -1,  282,  283,
   284,  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,
-  294,  295,  296,   -1,   -1,   91,  300,  272,  273,  274,
-  275,   -1,   -1,   -1,  279,  309,   -1,  311,  312,  257,
-  258,  259,  260,  261,   -1,  263,  264,  265,   -1,   -1,
-   -1,  269,   -1,  298,  299,   -1,   -1,   -1,   -1,   -1,
-  126,   -1,  280,   -1,  282,  283,  284,  285,  286,   -1,
-   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,   -1,
-   41,   -1,  300,   44,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  309,   -1,  311,  312,   -1,   41,   58,   59,   44,
-  257,  258,  259,  260,  261,   -1,  263,  264,  265,   -1,
-   -1,   -1,  269,   58,   59,   -1,   -1,   -1,   63,   -1,
-   -1,   -1,   -1,  280,   -1,  282,  283,  284,  285,  286,
-   -1,   -1,   93,   -1,  291,  292,  293,  294,  295,  296,
-   -1,   -1,   -1,  300,   -1,   -1,   -1,   -1,   93,   -1,
-   -1,   -1,  309,   -1,  311,  312,   -1,   33,   -1,   -1,
-   36,   37,   38,   -1,   40,   41,   42,   43,   -1,   45,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
-  274,  275,   -1,   -1,   -1,  279,   -1,   -1,   64,   -1,
-   -1,  257,  258,  259,  260,  261,   -1,  263,  264,  265,
-   -1,   -1,   -1,  269,  298,  299,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  280,   91,  282,  283,  284,  285,
-  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,
-  296,   -1,   33,   -1,  300,   36,   37,   38,   -1,   40,
-   -1,   42,   43,  309,   45,  311,  312,   -1,   -1,   -1,
-  126,  287,  288,  289,  290,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   64,   -1,   -1,  302,  303,  304,  305,
-  306,  307,   -1,   -1,  310,   -1,   -1,  313,  314,  315,
+  294,  295,  296,  289,  290,   -1,   33,   -1,  302,   36,
+   37,   38,   -1,   40,   -1,   42,   43,  311,   45,  313,
+  314,   -1,  308,  309,   -1,   -1,  312,   -1,   -1,  315,
+  316,  317,   59,   -1,   -1,   -1,   -1,   64,   -1,   -1,
+   -1,  287,  288,  289,  290,   -1,   33,   -1,   -1,   36,
+   37,   38,   -1,   40,   41,   42,   43,   -1,   45,  305,
+  306,  307,  308,  309,   91,   -1,  312,   -1,   -1,  315,
+  316,  317,   -1,   -1,   -1,   -1,   -1,   64,   -1,   -1,
+  287,  288,  289,  290,   -1,   -1,   33,   -1,   -1,   36,
+   37,   38,   -1,   40,   -1,   42,   43,   -1,   45,  126,
+  307,  308,  309,   -1,   91,  312,   -1,   -1,  315,  316,
+  317,   -1,   -1,   -1,   -1,   -1,   -1,   64,   -1,   -1,
+   -1,  272,  273,  274,  275,   -1,   33,   -1,  279,   36,
+   37,   38,   -1,   40,   41,   42,   43,   -1,   45,  126,
+   -1,   -1,   -1,   -1,   91,   -1,   93,  281,   -1,  300,
+  301,   -1,   -1,  287,  288,  289,  290,   64,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   91,   -1,   -1,   33,   -1,   -1,   36,   37,   38,   -1,
-   40,   41,   42,   43,   -1,   45,   -1,   -1,   -1,   -1,
-   -1,  272,  273,  274,  275,   -1,   -1,   -1,  279,   -1,
-   -1,   -1,   -1,   -1,   64,  126,   -1,  272,  273,  274,
-  275,   -1,   -1,   -1,  279,   -1,  281,  298,  299,   -1,
-   -1,   -1,  287,  288,  289,  290,   -1,   -1,   -1,   -1,
-   -1,   91,   -1,  298,  299,   -1,  301,  302,  303,  304,
-  305,  306,  307,   -1,   -1,  310,   -1,   -1,   33,   -1,
-   -1,   36,   37,   38,   -1,   40,   41,   42,   43,   -1,
-   45,  257,  258,  259,  260,  261,  126,  263,  264,  265,
-   -1,   -1,   -1,  269,   -1,   -1,   -1,   -1,   -1,   64,
-   -1,   -1,   -1,   -1,  280,   -1,  282,  283,  284,  285,
-  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,
-  296,   -1,   -1,   -1,  300,   -1,   91,   -1,   -1,   -1,
-   -1,   -1,   -1,  309,   -1,  311,  312,   -1,   33,   -1,
-   -1,   36,   37,   38,   -1,   40,   41,   42,   43,   -1,
-   45,   -1,   -1,   -1,   -1,  256,  257,  258,  259,  260,
-  261,  126,  263,  264,  265,   -1,   -1,   -1,  269,   64,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  280,
-   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,
-  291,  292,  293,  294,  295,  296,   91,   -1,   -1,  300,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  309,   -1,
-  311,  312,   -1,   -1,   -1,   -1,   -1,  257,  258,  259,
-  260,  261,   -1,  263,  264,  265,   -1,   -1,   -1,  269,
-   -1,  126,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,
-   -1,  291,  292,  293,  294,  295,  296,   -1,   33,   -1,
-  300,   36,   37,   38,   -1,   40,   -1,   42,   43,  309,
-   45,  311,  312,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   64,
-   -1,   -1,  257,  258,  259,  260,  261,   -1,  263,  264,
-  265,   -1,   -1,   -1,  269,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  280,   91,  282,  283,  284,
-  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,
-  295,  296,   -1,   -1,   -1,  300,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  309,   -1,  311,  312,   -1,   -1,
-   -1,  126,   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,
-   -1,   -1,  257,  258,  259,  260,  261,   -1,  263,  264,
-  265,   58,   59,   -1,  269,   -1,   63,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  280,   -1,  282,  283,  284,
-  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,
-  295,  296,   -1,   -1,   41,  300,   93,   44,   -1,   -1,
-   -1,   -1,   -1,   -1,  309,   -1,  311,  312,   -1,   -1,
-   -1,   58,   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,
+  304,  305,  306,  307,  308,  309,   -1,   -1,  312,  126,
+   -1,  315,  316,  317,   91,   -1,   33,   -1,   -1,   36,
+   37,   38,   -1,   40,   41,   42,   43,   -1,   45,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,
-   -1,   44,   -1,   -1,   -1,   -1,   93,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,
-   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  257,  258,  259,  260,  261,   -1,  263,  264,
-  265,   -1,   -1,   -1,  269,   -1,   -1,   -1,   -1,   -1,
-   93,   -1,   -1,   -1,   -1,  280,   -1,  282,  283,  284,
-  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,
-  295,  296,   -1,   41,   -1,  300,   44,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  309,   -1,  311,  312,   -1,   -1,
-   58,   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   64,   -1,  126,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  257,  258,  259,  260,  261,   -1,  263,  264,  265,   -1,
+   -1,   -1,  269,   -1,   91,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  280,   -1,  282,  283,  284,  285,  286,
+   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,
+  257,  258,  259,  260,  261,  302,  263,  264,  265,  126,
+   -1,   -1,  269,   -1,  311,   -1,  313,  314,   -1,   -1,
+   -1,   -1,   -1,  280,   -1,  282,  283,  284,  285,  286,
+   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,
+  257,  258,  259,  260,  261,  302,  263,  264,  265,   -1,
+   -1,   -1,  269,   -1,  311,   -1,  313,  314,   -1,   -1,
+   -1,   -1,   -1,  280,   -1,  282,  283,  284,  285,  286,
+   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,
+  257,  258,  259,  260,  261,  302,  263,  264,  265,   -1,
+   -1,   -1,  269,   -1,  311,   -1,  313,  314,   -1,   -1,
+   -1,   -1,   -1,  280,   -1,  282,  283,  284,  285,  286,
+   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,
+   -1,   -1,   -1,   33,   -1,  302,   36,   37,   38,   -1,
+   40,   41,   42,   43,  311,   45,  313,  314,   -1,   -1,
+  257,  258,  259,  260,  261,   -1,  263,  264,  265,   -1,
+   -1,   -1,  269,   -1,   64,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  280,   -1,  282,  283,  284,  285,  286,
+   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,
+   -1,   91,   -1,   33,   -1,  302,   36,   37,   38,   -1,
+   40,   41,   42,   43,  311,   45,  313,  314,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   41,   -1,   93,   44,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,
-   58,   59,  279,   -1,  281,   63,   -1,   -1,   -1,   -1,
-  287,  288,  289,  290,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  298,  299,   -1,  301,  302,  303,  304,  305,  306,
-  307,   -1,   -1,  310,   -1,   93,  313,  314,  315,   -1,
-   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,
-   -1,   -1,  279,   -1,  281,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   64,   -1,  126,   -1,   -1,   -1,
+   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,
+   59,   91,   33,   -1,   63,   36,   37,   38,   -1,   40,
+   -1,   42,   43,   -1,   45,   -1,   -1,   -1,   -1,   -1,
   287,  288,  289,  290,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  298,  299,   -1,  301,  302,  303,  304,  305,  306,
-  307,   -1,   -1,  310,   -1,   -1,  313,  314,  315,  272,
-  273,  274,  275,   -1,   -1,   -1,  279,   -1,  281,   -1,
-   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,
-   -1,   41,   -1,   -1,   44,  298,  299,   -1,  301,  302,
-  303,  304,  305,  306,  307,   -1,   -1,  310,   58,   59,
-  313,  314,  315,   63,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   64,   93,   -1,  126,  304,  305,  306,
+  307,  308,  309,   -1,   -1,  312,   -1,   -1,  315,  316,
+  317,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   91,   -1,   33,   -1,   -1,   36,   37,   38,   -1,   40,
+   41,   42,   43,   -1,   45,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   64,   -1,  126,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,  258,  259,
+  260,  261,   -1,  263,  264,  265,   -1,   -1,   -1,  269,
+   91,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,
+   -1,  291,  292,  293,  294,  295,  296,   -1,   -1,   -1,
+   -1,   -1,  302,   -1,   -1,  126,   -1,   -1,   -1,   -1,
+   -1,  311,   -1,  313,  314,   -1,   -1,  257,  258,  259,
+  260,  261,   -1,  263,  264,  265,   -1,   33,   -1,  269,
+   36,   37,   38,   -1,   40,   41,   42,   43,   -1,   45,
+  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,
+   -1,  291,  292,  293,  294,  295,  296,   -1,   64,   -1,
+   -1,   -1,  302,  272,  273,  274,  275,   -1,   -1,   -1,
+  279,  311,  281,  313,  314,  256,  257,  258,  259,  260,
+  261,   -1,  263,  264,  265,   91,   -1,   -1,  269,   -1,
+   -1,  300,  301,   -1,  303,  304,  305,  306,  307,  280,
+   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,
+  291,  292,  293,  294,  295,  296,   -1,   -1,   -1,   33,
+  126,  302,   36,   37,   38,   -1,   40,   41,   42,   43,
+  311,   45,  313,  314,   -1,   -1,  257,  258,  259,  260,
+  261,   -1,  263,  264,  265,   -1,   -1,   -1,  269,   -1,
+   64,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  280,
+   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,
+  291,  292,  293,  294,  295,  296,   -1,   91,   -1,   33,
+   -1,  302,   36,   37,   38,   -1,   40,   -1,   42,   43,
+  311,   45,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   28,   29,
+   64,   -1,  126,   -1,   -1,   -1,   -1,   -1,   41,   -1,
+   40,   44,   -1,   -1,   -1,   -1,   46,   47,   48,   -1,
+   -1,   -1,   52,   53,   -1,   58,   59,   91,   -1,   -1,
+   63,   -1,   -1,   -1,   -1,   65,   66,   67,   68,   -1,
+   -1,  257,  258,  259,  260,  261,   -1,  263,  264,  265,
+   -1,   -1,   -1,  269,   -1,   41,   -1,   -1,   44,   -1,
+   93,   -1,  126,   -1,  280,   -1,  282,  283,  284,  285,
+  286,   41,   -1,   59,   44,  291,  292,  293,  294,  295,
+  296,   -1,  112,   -1,   -1,   -1,  302,   -1,   58,   59,
+   -1,   -1,   -1,   63,   -1,  311,   -1,  313,  314,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   93,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   93,  272,  273,  274,  275,   -1,   -1,
-   -1,  279,   -1,  281,   -1,   -1,   -1,   -1,   -1,  287,
-  288,  289,  290,   -1,   -1,   -1,   41,   -1,   -1,   44,
-  298,  299,   -1,  301,  302,  303,  304,  305,  306,  307,
-   -1,   -1,  310,   58,   59,  313,  314,  315,   63,   -1,
+   -1,   -1,   -1,   93,   -1,   41,   -1,   -1,   44,   -1,
+   -1,   -1,   -1,  257,  258,  259,  260,  261,   -1,  263,
+  264,  265,   58,   59,   -1,  269,  176,   63,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  280,   -1,  282,  283,
+  284,  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,
+  294,  295,  296,  203,   -1,   -1,   -1,   93,  302,   -1,
+   -1,   -1,   -1,   -1,   -1,   41,   -1,  311,   44,  313,
+  314,   -1,   -1,  257,  258,  259,  260,  261,   -1,  263,
+  264,  265,   58,   59,   -1,  269,   -1,   63,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  280,   -1,  282,  283,
+  284,  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,
+  294,  295,  296,   -1,   -1,   -1,   -1,   93,  302,  272,
+  273,  274,  275,   -1,   -1,   -1,  279,  311,  281,  313,
+  314,   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,
+   -1,   -1,   -1,   41,   -1,   -1,   44,  300,  301,   -1,
+  303,  304,  305,  306,  307,  308,  309,   -1,   -1,  312,
+   58,   59,  315,  316,  317,   63,  272,  273,  274,  275,
+   -1,   -1,   -1,  279,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,  279,
+   41,  281,   -1,   44,  300,   93,   -1,  287,  288,  289,
+  290,   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,
+  300,  301,   63,  303,  304,  305,  306,  307,  308,  309,
+   -1,   -1,  312,   -1,   -1,  315,  316,  317,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,
+   -1,   41,   93,  279,   44,  281,   -1,   -1,   -1,   -1,
+   -1,  287,  288,  289,  290,   -1,   -1,   -1,   58,   59,
+   -1,   -1,   -1,   63,  300,  301,   -1,  303,  304,  305,
+  306,  307,  308,  309,   -1,   -1,  312,   -1,   -1,  315,
+  316,  317,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   41,   93,   -1,   44,  272,  273,  274,  275,
+   -1,   41,   -1,  279,   44,  281,   -1,   -1,   -1,   58,
+   59,  287,  288,  289,  290,   -1,   -1,   -1,   58,   59,
+   -1,   -1,   -1,   63,  300,  301,   -1,  303,  304,  305,
+  306,  307,  308,  309,   -1,   -1,  312,   -1,   -1,  315,
+  316,  317,   -1,   -1,   93,   -1,   -1,   41,   -1,   -1,
+   44,   -1,   -1,   93,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,   63,
    -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,
    -1,  279,   -1,  281,   -1,   -1,   -1,   -1,   -1,  287,
-  288,  289,  290,   -1,   -1,   -1,   41,   -1,   93,   44,
-  298,  299,   -1,  301,  302,  303,  304,  305,  306,  307,
-   -1,   -1,  310,   58,   59,  313,  314,  315,   63,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   41,   -1,   -1,   44,   -1,   -1,   -1,   -1,   93,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,
-   -1,   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   41,   -1,   93,   44,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  272,  273,  274,  275,   -1,   58,   59,  279,
-   -1,  281,   63,   -1,   -1,   -1,   -1,  287,  288,  289,
-  290,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  298,  299,
-   -1,  301,  302,  303,  304,  305,  306,  307,   41,   -1,
-  310,   44,   93,  313,  314,  315,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,
-   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
-  275,   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,   -1,
-   93,   -1,  287,  288,  289,  290,   -1,   -1,   -1,   41,
-   -1,   -1,   44,  298,  299,   -1,  301,  302,  303,  304,
-  305,  306,  307,   -1,   -1,  310,   58,   59,  313,  314,
-  315,   63,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
-  275,   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,   -1,
-   -1,   -1,  287,  288,  289,  290,   -1,   -1,   -1,   -1,
-   -1,   93,   -1,  298,  299,   -1,  301,  302,  303,  304,
-  305,  306,  307,   -1,   -1,  310,   -1,   -1,  313,  314,
-  315,  272,  273,  274,  275,   -1,   -1,   -1,  279,   -1,
+  288,  289,  290,   -1,   -1,   -1,   -1,   -1,   -1,   93,
+   -1,   -1,  300,  301,   -1,  303,  304,  305,  306,  307,
+  308,  309,   -1,   -1,  312,   -1,   -1,  315,  316,  317,
+   -1,  272,  273,  274,  275,   -1,   41,   -1,  279,   44,
   281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,
-   -1,   -1,   -1,   41,   -1,   -1,   44,  298,  299,   -1,
-  301,  302,  303,  304,  305,  306,  307,   -1,   -1,  310,
-   58,   59,  313,  314,  315,   63,   -1,   -1,   -1,   -1,
-   -1,  272,  273,  274,  275,   -1,   -1,   -1,  279,   -1,
-  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,
-   -1,   -1,   -1,   -1,   -1,   93,   -1,  298,  299,   -1,
-  301,  302,  303,  304,  305,  306,  307,   41,   -1,  310,
-   -1,   -1,  313,  314,  315,   -1,   -1,   -1,   -1,  272,
-  273,  274,  275,   -1,   58,   59,  279,   -1,  281,   63,
-   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  298,  299,   -1,  301,  302,
-  303,  304,  305,  306,  307,   -1,   41,  310,   -1,   93,
-  313,  314,  315,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,   63,   -1,
+   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,   63,  300,
+  301,   -1,  303,  304,  305,  306,  307,  308,  309,   -1,
+   -1,  312,   -1,   -1,  315,  316,  317,   -1,   -1,   -1,
+   -1,   -1,  272,  273,  274,  275,   -1,   41,   93,  279,
+   44,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,
+  290,   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,   63,
+  300,  301,   -1,  303,  304,  305,  306,  307,  308,  309,
+   -1,   -1,  312,   -1,   -1,  315,  316,  317,   -1,   -1,
+   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,   93,
+  279,   -1,  272,  273,  274,  275,   -1,   41,   -1,  279,
+   44,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,
+  290,  300,  301,   -1,   58,   59,   -1,   -1,   -1,   63,
+  300,  301,   -1,  303,  304,  305,  306,  307,  308,  309,
+   -1,   -1,  312,   -1,   -1,  315,  316,  317,  272,  273,
+  274,  275,   -1,   41,   -1,  279,   44,  281,   -1,   93,
+   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,   -1,
+   58,   59,   -1,   -1,   -1,   63,  300,  301,   -1,  303,
+  304,  305,  306,  307,  308,  309,   -1,   -1,  312,   -1,
+   -1,  315,  316,  317,   -1,   -1,   -1,   -1,   -1,   41,
+   -1,   -1,   44,   -1,   -1,   93,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,   -1,
+   -1,   63,   41,   -1,   -1,   44,   -1,  272,  273,  274,
+  275,   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,   58,
+   59,   -1,  287,  288,  289,  290,   -1,   -1,   -1,   -1,
+   -1,   93,   -1,   -1,   -1,  300,  301,   -1,  303,  304,
+  305,  306,  307,  308,  309,   -1,   -1,  312,   -1,   -1,
+  315,  316,  317,   41,   93,   -1,   44,   -1,  272,  273,
+  274,  275,   41,   -1,   -1,  279,   -1,  281,   -1,   -1,
+   58,   59,   -1,  287,  288,  289,  290,   -1,   -1,   58,
+   59,   -1,   -1,   -1,   63,   -1,  300,  301,   -1,  303,
+  304,  305,  306,  307,  308,  309,   -1,   -1,  312,   -1,
+   -1,  315,  316,  317,   -1,   93,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   93,   -1,   -1,   -1,  272,  273,
+  274,  275,   41,   -1,   -1,  279,   -1,  281,   -1,   -1,
+   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,   58,
+   59,   -1,   -1,   -1,   63,   -1,  300,  301,   -1,  303,
+  304,  305,  306,  307,  308,  309,   -1,   -1,  312,   -1,
+   -1,  315,  316,  317,  272,  273,  274,  275,   41,   -1,
+   -1,  279,   -1,  281,   93,   -1,   -1,   -1,   -1,  287,
+  288,  289,  290,   -1,   -1,   58,   59,   -1,   -1,   -1,
+   63,   -1,  300,  301,   -1,  303,  304,  305,  306,  307,
+  308,  309,   -1,   -1,  312,   -1,   -1,  315,  316,  317,
   272,  273,  274,  275,   -1,   -1,   -1,  279,   -1,  281,
-   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,
-   -1,   -1,   41,   -1,   -1,   -1,  298,  299,   93,  301,
-  302,  303,  304,  305,  306,  307,   -1,   -1,  310,   58,
-   59,  313,  314,  315,   63,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,
-   -1,   -1,   -1,   -1,   93,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,   63,   -1,
+   93,   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,
+   -1,   -1,   -1,  272,  273,  274,  275,   -1,  300,  301,
+  279,  303,  304,  305,  306,  307,  308,  309,   -1,   41,
+  312,   -1,   44,  315,  316,  317,   -1,   -1,   -1,   -1,
+   -1,  300,  301,   -1,  303,   -1,   58,   59,   -1,   -1,
+   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,
-   -1,  279,   -1,  281,   -1,   -1,   -1,   -1,   -1,  287,
-  288,  289,  290,   -1,   -1,   -1,   41,   -1,   93,   44,
-  298,  299,   -1,  301,  302,  303,  304,  305,  306,  307,
-   -1,   -1,  310,   58,   59,  313,  314,  315,   63,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
-  274,  275,   -1,   -1,   -1,  279,   -1,  281,   93,   -1,
-   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,   -1,
-   41,   -1,   -1,   44,  298,  299,   -1,  301,  302,  303,
-  304,  305,  306,  307,   -1,   -1,  310,   58,   59,  313,
-  314,  315,   63,   -1,   -1,   -1,   -1,  272,  273,  274,
-  275,   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,   -1,
-   -1,   -1,  287,  288,  289,  290,   -1,   -1,   -1,   -1,
-   -1,   -1,   93,  298,  299,   -1,  301,  302,  303,  304,
-  305,  306,  307,   -1,   -1,  310,   -1,   -1,  313,  314,
-  315,   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,
-  279,   -1,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,
-  289,  290,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  298,
-  299,   -1,  301,  302,  303,  304,  305,  306,  307,   -1,
-   -1,  310,   -1,   -1,  313,  314,  315,  272,  273,  274,
-  275,   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,   -1,
-   -1,   -1,  287,  288,  289,  290,   41,   -1,   -1,   44,
-   -1,   -1,   -1,  298,  299,   -1,  301,  302,  303,  304,
-  305,  306,  307,   58,   59,  310,   -1,   -1,   63,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
-  275,   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,   -1,
-   -1,   -1,  287,  288,  289,  290,   -1,   41,   93,   -1,
-   44,   -1,   -1,  298,  299,   -1,  301,  302,  303,  304,
-  305,  306,  307,   -1,   58,   59,   -1,   -1,   -1,   63,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  279,   -1,  272,  273,  274,  275,   -1,   -1,   -1,
+  279,   93,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,
+  289,  290,  300,  301,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  300,  301,   -1,  303,  304,  305,  306,  307,  308,
+  309,   -1,   -1,  312,   -1,   -1,  315,  316,  317,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  272,  273,  274,  275,   -1,   -1,   -1,  279,   93,
-  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,
-   41,   -1,   -1,   44,   -1,   -1,   -1,  298,  299,   -1,
-  301,  302,  303,  304,  305,  306,  307,   58,   59,   -1,
-   -1,   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,
+   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,
+  279,   41,  281,   -1,   44,   -1,   -1,   -1,  287,  288,
+  289,  290,   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,
+   -1,  300,  301,   63,  303,  304,  305,  306,  307,  308,
+  309,   -1,   -1,  312,   -1,   -1,  315,  316,  317,  272,
+  273,  274,  275,   -1,   41,   -1,  279,   44,  281,   -1,
+   -1,   -1,   -1,   93,  287,  288,  289,  290,   -1,   -1,
+   -1,   58,   59,   -1,   -1,   -1,   63,  300,  301,   -1,
+  303,  304,  305,  306,  307,  308,  309,   33,   -1,  312,
+   -1,   -1,  315,  316,  317,   41,   -1,   -1,   41,   45,
+   -1,   44,   48,   -1,   -1,   51,   93,   -1,   -1,   55,
+   56,   57,   58,   59,   -1,   58,   59,   63,   64,   -1,
+   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  272,  273,  274,  275,   -1,   -1,   -1,  279,   41,  281,
+   -1,   44,   -1,   -1,   -1,  287,  288,  289,  290,   -1,
+   93,   -1,   98,   -1,   -1,   58,   59,   -1,  300,  301,
+   63,  303,  304,  305,  306,  307,  308,  309,   -1,   -1,
+  312,   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   93,   58,   59,   -1,   -1,   -1,   63,   -1,
+   93,   -1,   -1,   58,   59,   -1,   -1,   -1,   63,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   93,   -1,
-   58,   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,  160,  161,  162,  163,  164,  165,
+  166,  167,  168,  169,  170,  171,  172,  173,   93,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
-  275,   -1,   -1,   -1,  279,   93,  281,   -1,   -1,   -1,
-   -1,   -1,  287,  288,  289,  290,   41,   -1,   -1,   44,
-   -1,   -1,   -1,  298,  299,   -1,  301,  302,  303,  304,
-  305,  306,  307,   58,   59,   -1,   -1,   -1,   63,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
+   -1,  187,  272,  273,  274,  275,   -1,   41,   -1,  279,
+   44,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,
+  290,   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,   63,
+  300,  301,   -1,  303,  304,  305,  306,  307,  308,  309,
+   -1,   -1,  312,   -1,   -1,  272,  273,  274,  275,   -1,
+   41,   -1,  279,   44,  281,   -1,   -1,   -1,   -1,   93,
+  287,  288,  289,  290,   -1,   -1,   -1,   58,   59,   -1,
+   -1,   -1,   63,  300,  301,   -1,  303,  304,  305,  306,
+  307,  308,  309,   -1,   -1,   -1,  272,   -1,   -1,  272,
+  273,  274,  275,   -1,   -1,   -1,  279,   41,  281,   -1,
+   44,   -1,   93,   -1,  287,  288,  289,  290,   -1,   -1,
+   -1,   -1,   -1,   -1,   58,   59,   -1,  300,  301,  305,
+  303,  304,  305,  306,  307,  308,  309,   -1,   -1,  272,
+  273,  274,  275,   -1,   41,   -1,  279,   44,  281,   -1,
+   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,   93,
+   -1,   58,   59,   -1,   -1,   -1,   63,  300,  301,   -1,
+  303,  304,  305,  306,  307,  308,  309,  272,  273,  274,
+  275,   -1,   41,   -1,  279,   44,  281,   -1,   -1,   -1,
+   -1,   -1,  287,  288,  289,  290,   93,   -1,   -1,   58,
+   59,   -1,   -1,   -1,   63,  300,  301,   -1,  303,  304,
+  305,  306,  307,  308,  309,   -1,   -1,   -1,   -1,   41,
+   -1,   -1,   44,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   93,   -1,   58,   59,   -1,   -1,
+   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
   274,  275,   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,
-   -1,   -1,   -1,  287,  288,  289,  290,   41,   93,   -1,
-   44,   -1,   -1,   -1,  298,  299,   -1,  301,  302,  303,
-  304,  305,  306,  307,   58,   59,   -1,   -1,   -1,   63,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  272,  273,  274,  275,   -1,   -1,   -1,  279,   93,
+   -1,   -1,   -1,  287,  288,  289,  290,   58,   -1,   -1,
+   -1,   93,   63,   -1,   -1,   -1,  300,  301,   -1,  303,
+  304,  305,  306,  307,  308,  309,   -1,   -1,   -1,   -1,
+   -1,  272,  273,  274,  275,   -1,   41,   -1,  279,   44,
   281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  298,  299,   -1,
-  301,  302,  303,  304,  305,  306,  307,  272,  273,  274,
-  275,   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,   -1,
-   -1,   -1,  287,  288,  289,  290,   -1,   -1,   -1,   -1,
-   -1,   -1,   41,  298,  299,   44,  301,  302,  303,  304,
-  305,  306,  307,   -1,  272,  273,  274,  275,   -1,   58,
-   59,  279,   -1,  281,   63,   -1,   -1,   -1,   -1,  287,
-  288,  289,  290,   -1,   -1,   -1,   -1,   -1,   -1,   41,
-  298,  299,   44,  301,  302,  303,  304,  305,  306,  307,
-   41,   -1,   -1,   44,   93,   -1,   58,   59,   -1,   -1,
-   -1,   63,   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,
-   -1,   -1,   63,   -1,   -1,   -1,   -1,  272,  273,  274,
-  275,   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,   -1,
-   -1,   93,  287,  288,  289,  290,   41,   -1,   -1,   44,
-   -1,   -1,   93,  298,  299,   -1,  301,  302,  303,  304,
-  305,  306,   -1,   58,   59,   -1,   -1,   -1,   63,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
-  274,  275,   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,
-   -1,   -1,   -1,  287,  288,   -1,  290,   41,   93,   -1,
-   44,   -1,   -1,   -1,  298,  299,   -1,  301,  302,  303,
-  304,  305,  306,   -1,   58,   59,   -1,   -1,   -1,   63,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,   -1,
-   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,   93,
-   -1,   -1,   58,   59,   -1,   -1,   -1,   63,   -1,   -1,
-   -1,   -1,   58,   59,   -1,   -1,   -1,   63,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  272,  273,  274,  275,   93,   -1,   -1,
-  279,   -1,  281,   -1,   -1,   -1,   -1,   93,  287,  288,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  298,
-  299,   -1,  301,  302,  303,  304,  305,  306,   -1,   -1,
-  272,  273,  274,  275,   -1,   -1,   -1,  279,   -1,  281,
-   -1,  272,  273,  274,  275,  287,  288,   -1,  279,   -1,
-  281,   -1,   -1,   -1,   -1,   -1,  298,  299,   -1,  301,
-  302,  303,  304,  305,   -1,   -1,   -1,  298,  299,   -1,
-  301,  302,  303,  304,  305,   41,   -1,   -1,   44,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
-  275,   -1,   58,   59,  279,   -1,  281,   63,   -1,   -1,
-   -1,   -1,  287,  288,   -1,   -1,   -1,   -1,   41,   -1,
-   -1,   44,   -1,  298,  299,   -1,  301,  302,  303,  304,
-  305,   -1,   -1,   -1,   -1,   58,   59,   93,   -1,   -1,
-   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
-  274,  275,   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,
-   -1,   -1,   -1,  287,  288,   -1,   -1,   -1,   -1,   -1,
-   93,   -1,   -1,   -1,  298,  299,   -1,  301,  302,  303,
-  304,  305,   -1,   -1,   -1,   -1,  272,  273,  274,  275,
-   -1,   -1,   -1,  279,   -1,  281,  272,  273,  274,  275,
-   -1,  287,  288,  279,   -1,  281,   -1,   -1,   -1,   -1,
-   -1,   -1,  298,  299,   -1,  301,  302,  303,  304,  305,
-   -1,   41,  298,  299,   44,  301,  302,  303,  304,  305,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,
-   30,   -1,   -1,   63,   -1,   -1,   -1,   -1,   38,   -1,
-   -1,   -1,   42,   -1,   -1,   45,   -1,   -1,   -1,   -1,
-   -1,   -1,   52,   53,   54,   55,   56,   -1,   -1,   -1,
-   60,   61,   -1,   93,   -1,   -1,   66,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   94,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,
-   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  298,  299,   -1,  301,  302,  303,  304,  272,
+   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,   63,  300,
+  301,   -1,  303,  304,  305,  306,  307,  308,  309,   -1,
+   -1,   -1,   -1,   41,   -1,   -1,   44,   -1,  272,  273,
+  274,  275,   -1,   41,   -1,  279,   44,   -1,   93,   -1,
+   58,   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,   -1,
+   58,   59,   -1,   -1,   -1,   63,  300,  301,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,
+   41,   -1,  279,   44,  281,   93,   -1,   -1,   -1,   -1,
+  287,  288,  289,  290,   -1,   93,   -1,   58,   59,   -1,
+   -1,   -1,   63,  300,  301,   -1,  303,  304,  305,  306,
+  307,  308,  309,  272,  273,  274,  275,   -1,   41,   -1,
+  279,   44,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,
+  289,  290,   93,   -1,   -1,   58,   59,   -1,   -1,   -1,
+   63,  300,  301,   -1,  303,  304,  305,  306,  307,  308,
+  272,  273,  274,  275,   -1,   41,   -1,  279,   44,  281,
+   -1,   -1,   -1,   -1,   -1,  287,  288,   -1,  290,   -1,
+   93,   41,   58,   59,   44,   -1,   -1,   63,  300,  301,
+   -1,  303,  304,  305,  306,  307,  308,   -1,   58,   59,
+  281,   -1,   -1,   63,   -1,   -1,  287,  288,  289,  290,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   93,   -1,   -1,
+   -1,   -1,  303,  304,  305,  306,  307,  308,  309,   -1,
+   -1,  312,   -1,   93,  315,  316,  317,  272,  273,  274,
+  275,   -1,   41,   -1,  279,   44,  281,   -1,   -1,   -1,
+   -1,   -1,  287,  288,   -1,   -1,   -1,   -1,   -1,   58,
+   59,   -1,   -1,   -1,   63,  300,  301,   -1,  303,  304,
+  305,  306,  307,   -1,  272,  273,  274,  275,   -1,   41,
+   -1,  279,   44,  281,  272,  273,  274,  275,   -1,  287,
+  288,  279,   -1,  281,   93,   -1,   58,   59,   -1,  287,
+  288,   63,  300,  301,   -1,  303,  304,  305,  306,  307,
+   -1,   -1,  300,  301,   -1,  303,  304,  305,  306,  307,
+   -1,  272,  273,  274,  275,   -1,   -1,   -1,  279,   -1,
+  281,   93,   -1,   -1,   -1,   -1,  287,  288,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  300,
+  301,   -1,  303,  304,  305,  306,  307,   -1,   -1,  272,
   273,  274,  275,   -1,   -1,   -1,  279,   -1,  281,   -1,
-   -1,  151,  152,  153,  154,  155,  156,  157,  158,  159,
-  160,  161,  162,  163,  164,  298,  299,   -1,  301,  302,
-  303,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  178,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,  288,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  300,  301,   -1,
+  303,  304,  305,  306,  307,   -1,  272,  273,  274,  275,
+   -1,   -1,   -1,  279,   -1,  281,   -1,   -1,   -1,   -1,
+   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,  279,
+   -1,  281,   -1,   -1,  300,  301,   -1,  303,  304,  305,
+  306,  307,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  300,  301,   -1,  303,  304,  305,  306,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,
+  279,   -1,  281,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  300,  301,   -1,  303,  304,  305,   -1,   -1,   -1,
+  272,  273,  274,  275,   -1,   -1,   -1,  279,   -1,  281,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,  279,
-   -1,  281,   -1,   -1,   -1,   -1,   -1,   -1,  258,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  298,  299,
-   -1,  301,  302,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  289,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  300,  301,
+   -1,  303,  304,
 };
 #define YYFINAL 1
 #ifndef YYDEBUG
 #define YYDEBUG 0
 #endif
-#define YYMAXTOKEN 315
+#define YYMAXTOKEN 317
 #if YYDEBUG
 static char *yyname[] = {
 "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -1139,9 +1142,9 @@ static char *yyname[] = {
 "ANONSUB","PACKAGE","USE","WHILE","UNTIL","IF","UNLESS","ELSE","ELSIF",
 "CONTINUE","FOR","LOOPEX","DOTDOT","FUNC0","FUNC1","FUNC","UNIOP","LSTOP",
 "RELOP","EQOP","MULOP","ADDOP","DOLSHARP","DO","HASHBRACK","NOAMP","LOCAL","MY",
-"PREC_LOW","OROP","ANDOP","NOTOP","ASSIGNOP","OROR","ANDAND","BITOROP",
-"BITANDOP","SHIFTOP","MATCHOP","UMINUS","REFGEN","POWOP","PREINC","PREDEC",
-"POSTINC","POSTDEC","ARROW",
+"MYSUB","COLONATTR","PREC_LOW","OROP","ANDOP","NOTOP","ASSIGNOP","OROR",
+"ANDAND","BITOROP","BITANDOP","SHIFTOP","MATCHOP","UMINUS","REFGEN","POWOP",
+"PREINC","PREDEC","POSTINC","POSTDEC","ARROW",
 };
 static char *yyrule[] = {
 "$accept : prog",
@@ -1192,18 +1195,25 @@ static char *yyrule[] = {
 "label : LABEL",
 "decl : format",
 "decl : subrout",
+"decl : mysubrout",
 "decl : package",
 "decl : use",
 "format : FORMAT startformsub formname block",
 "formname : WORD",
 "formname :",
-"subrout : SUB startsub subname proto subbody",
+"mysubrout : MYSUB startsub subname proto subattrlist subbody",
+"subrout : SUB startsub subname proto subattrlist subbody",
 "startsub :",
 "startanonsub :",
 "startformsub :",
 "subname : WORD",
 "proto :",
 "proto : THING",
+"subattrlist :",
+"subattrlist : COLONATTR THING",
+"subattrlist : COLONATTR",
+"myattrlist : COLONATTR THING",
+"myattrlist : COLONATTR",
 "subbody : block",
 "subbody : ';'",
 "package : PACKAGE WORD ';'",
@@ -1262,14 +1272,15 @@ static char *yyrule[] = {
 "term : term POSTDEC",
 "term : PREINC term",
 "term : PREDEC term",
-"term : local term",
+"term : myattrterm",
+"term : LOCAL term",
 "term : '(' expr ')'",
 "term : '(' ')'",
 "term : '[' expr ']'",
 "term : '[' ']'",
 "term : HASHBRACK expr ';' '}'",
 "term : HASHBRACK ';' '}'",
-"term : ANONSUB startanonsub proto block",
+"term : ANONSUB startanonsub proto subattrlist block",
 "term : scalar",
 "term : star",
 "term : hsh",
@@ -1307,13 +1318,18 @@ static char *yyrule[] = {
 "term : PMFUNC '(' term ',' term ')'",
 "term : WORD",
 "term : listop",
+"myattrterm : MY myterm myattrlist",
+"myattrterm : MY myterm",
+"myterm : '(' expr ')'",
+"myterm : '(' ')'",
+"myterm : scalar",
+"myterm : hsh",
+"myterm : ary",
 "listexpr :",
 "listexpr : argexpr",
 "listexprcom :",
 "listexprcom : expr",
 "listexprcom : expr ','",
-"local : LOCAL",
-"local : MY",
 "my_scalar : scalar",
 "amper : '&' indirob",
 "scalar : '$' indirob",
@@ -1341,26 +1357,22 @@ static char *yyrule[] = {
 #define YYMAXDEPTH 500
 #endif
 #endif
-#line 666 "perly.y"
+#line 726 "perly.y"
  /* PROGRAM */
-#line 1427 "perly.c"
+
+/* more stuff added to make perly_c.diff easier to apply */
+
+#ifdef yyparse
+#undef yyparse
+#endif
+#define yyparse() Perl_yyparse(pTHX)
+
+#line 1371 "perly.c"
 #define YYABORT goto yyabort
 #define YYACCEPT goto yyaccept
 #define YYERROR goto yyerrlab
-
-struct ysv {
-    short* yyss;
-    YYSTYPE* yyvs;
-    int oldyydebug;
-    int oldyynerrs;
-    int oldyyerrflag;
-    int oldyychar;
-    YYSTYPE oldyyval;
-    YYSTYPE oldyylval;
-};
-
 int
-Perl_yyparse(pTHX)
+yyparse()
 {
     register int yym, yyn, yystate;
     register short *yyssp;
@@ -1371,9 +1383,6 @@ Perl_yyparse(pTHX)
     int retval = 0;
 #if YYDEBUG
     register char *yys;
-#ifndef __cplusplus
-    extern char *getenv();
-#endif
 #endif
 
     struct ysv *ysave;
@@ -1385,7 +1394,7 @@ Perl_yyparse(pTHX)
     ysave->oldyychar   = yychar;
     ysave->oldyyval    = yyval;
     ysave->oldyylval   = yylval;
-
+  
 #if YYDEBUG
     if (yys = getenv("YYDEBUG"))
     {
@@ -1424,7 +1433,7 @@ yyloop:
             yys = 0;
             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
             if (!yys) yys = "illegal-symbol";
-            printf("yydebug: state %d, reading %d (%s)\n", yystate,
+            PerlIO_printf(Perl_debug_log, "yydebug: state %d, reading %d (%s)\n", yystate,
                     yychar, yys);
         }
 #endif
@@ -1446,10 +1455,8 @@ yyloop:
            int yyps_index = (yyssp - yyss);
            int yypv_index = (yyvsp - yyvs);
            yystacksize += YYSTACKSIZE;
-           ysave->yyvs = yyvs =
-               (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
-           ysave->yyss = yyss =
-               (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short));
+           ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+           ysave->yyss = Renew(yyss, yystacksize, short);
            if (!yyvs || !yyss)
                goto yyoverflow;
            yyssp = yyss + yyps_index;
@@ -1490,8 +1497,8 @@ yyinrecovery:
 #if YYDEBUG
                 if (yydebug)
                     PerlIO_printf(Perl_debug_log,
-                    "yydebug: state %d, error recovery shifting to state %d\n",
-                    *yyssp, yytable[yyn]);
+                                 "yydebug: state %d, error recovery shifting to state %d\n",
+                                 *yyssp, yytable[yyn]);
 #endif
                 if (yyssp >= yyss + yystacksize - 1)
                 {
@@ -1502,10 +1509,8 @@ yyinrecovery:
                    int yyps_index = (yyssp - yyss);
                    int yypv_index = (yyvsp - yyvs);
                    yystacksize += YYSTACKSIZE;
-                   ysave->yyvs = yyvs = (YYSTYPE*)PerlMem_realloc((char*)yyvs,
-                       yystacksize * sizeof(YYSTYPE));
-                   ysave->yyss = yyss = (short*)PerlMem_realloc((char*)yyss,
-                       yystacksize * sizeof(short));
+                   ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+                   ysave->yyss = Renew(yyss, yystacksize, short);
                    if (!yyvs || !yyss)
                        goto yyoverflow;
                    yyssp = yyss + yyps_index;
@@ -1519,9 +1524,8 @@ yyinrecovery:
             {
 #if YYDEBUG
                 if (yydebug)
-                    PerlIO_printf(Perl_debug_log,
-                       "yydebug: error recovery discarding state %d\n",
-                       *yyssp);
+                    PerlIO_printf(Perl_debug_log, "yydebug: error recovery discarding state %d\n",
+                            *yyssp);
 #endif
                 if (yyssp <= yyss) goto yyabort;
                 --yyssp;
@@ -1538,9 +1542,8 @@ yyinrecovery:
             yys = 0;
             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
             if (!yys) yys = "illegal-symbol";
-            PerlIO_printf(Perl_debug_log,
-               "yydebug: state %d, error recovery discards token %d (%s)\n",
-               yystate, yychar, yys);
+            PerlIO_printf(Perl_debug_log, "yydebug: state %d, error recovery discards token %d (%s)\n",
+                    yystate, yychar, yys);
         }
 #endif
         yychar = (-1);
@@ -1557,7 +1560,7 @@ yyreduce:
     switch (yyn)
     {
 case 1:
-#line 101 "perly.y"
+#line 125 "perly.y"
 {
 #if defined(YYDEBUG) && defined(DEBUGGING)
                    yydebug = (PL_debug & 1);
@@ -1566,50 +1569,50 @@ case 1:
                }
 break;
 case 2:
-#line 108 "perly.y"
+#line 132 "perly.y"
 { newPROG(yyvsp[0].opval); }
 break;
 case 3:
-#line 112 "perly.y"
+#line 136 "perly.y"
 { if (PL_copline > (line_t)yyvsp[-3].ival)
                              PL_copline = yyvsp[-3].ival;
                          yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); }
 break;
 case 4:
-#line 118 "perly.y"
+#line 142 "perly.y"
 { yyval.ival = block_start(TRUE); }
 break;
 case 5:
-#line 122 "perly.y"
+#line 146 "perly.y"
 { if (PL_copline > (line_t)yyvsp[-3].ival)
                              PL_copline = yyvsp[-3].ival;
                          yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); }
 break;
 case 6:
-#line 128 "perly.y"
+#line 152 "perly.y"
 { yyval.ival = block_start(FALSE); }
 break;
 case 7:
-#line 132 "perly.y"
+#line 156 "perly.y"
 { yyval.opval = Nullop; }
 break;
 case 8:
-#line 134 "perly.y"
+#line 158 "perly.y"
 { yyval.opval = yyvsp[-1].opval; }
 break;
 case 9:
-#line 136 "perly.y"
+#line 160 "perly.y"
 {   yyval.opval = append_list(OP_LINESEQ,
                                (LISTOP*)yyvsp[-1].opval, (LISTOP*)yyvsp[0].opval);
                            PL_pad_reset_pending = TRUE;
                            if (yyvsp[-1].opval && yyvsp[0].opval) PL_hints |= HINT_BLOCK_SCOPE; }
 break;
 case 10:
-#line 143 "perly.y"
+#line 167 "perly.y"
 { yyval.opval = newSTATEOP(0, yyvsp[-1].pval, yyvsp[0].opval); }
 break;
 case 12:
-#line 146 "perly.y"
+#line 170 "perly.y"
 { if (yyvsp[-1].pval != Nullch) {
                              yyval.opval = newSTATEOP(0, yyvsp[-1].pval, newOP(OP_NULL, 0));
                            }
@@ -1620,75 +1623,75 @@ case 12:
                            PL_expect = XSTATE; }
 break;
 case 13:
-#line 155 "perly.y"
+#line 179 "perly.y"
 { yyval.opval = newSTATEOP(0, yyvsp[-2].pval, yyvsp[-1].opval);
                          PL_expect = XSTATE; }
 break;
 case 14:
-#line 160 "perly.y"
+#line 184 "perly.y"
 { yyval.opval = Nullop; }
 break;
 case 15:
-#line 162 "perly.y"
+#line 186 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
 case 16:
-#line 164 "perly.y"
+#line 188 "perly.y"
 { yyval.opval = newLOGOP(OP_AND, 0, yyvsp[0].opval, yyvsp[-2].opval); }
 break;
 case 17:
-#line 166 "perly.y"
+#line 190 "perly.y"
 { yyval.opval = newLOGOP(OP_OR, 0, yyvsp[0].opval, yyvsp[-2].opval); }
 break;
 case 18:
-#line 168 "perly.y"
+#line 192 "perly.y"
 { yyval.opval = newLOOPOP(OPf_PARENS, 1, scalar(yyvsp[0].opval), yyvsp[-2].opval); }
 break;
 case 19:
-#line 170 "perly.y"
+#line 194 "perly.y"
 { yyval.opval = newLOOPOP(OPf_PARENS, 1, yyvsp[0].opval, yyvsp[-2].opval);}
 break;
 case 20:
-#line 172 "perly.y"
+#line 196 "perly.y"
 { yyval.opval = newFOROP(0, Nullch, yyvsp[-1].ival,
                                        Nullop, yyvsp[0].opval, yyvsp[-2].opval, Nullop); }
 break;
 case 21:
-#line 177 "perly.y"
+#line 201 "perly.y"
 { yyval.opval = Nullop; }
 break;
 case 22:
-#line 179 "perly.y"
+#line 203 "perly.y"
 { yyval.opval = scope(yyvsp[0].opval); }
 break;
 case 23:
-#line 181 "perly.y"
+#line 205 "perly.y"
 { PL_copline = yyvsp[-5].ival;
                            yyval.opval = newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval);
                            PL_hints |= HINT_BLOCK_SCOPE; }
 break;
 case 24:
-#line 187 "perly.y"
+#line 211 "perly.y"
 { PL_copline = yyvsp[-6].ival;
                            yyval.opval = block_end(yyvsp[-4].ival,
                                   newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); }
 break;
 case 25:
-#line 191 "perly.y"
+#line 215 "perly.y"
 { PL_copline = yyvsp[-6].ival;
                            yyval.opval = block_end(yyvsp[-4].ival,
                                   newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); }
 break;
 case 26:
-#line 197 "perly.y"
+#line 221 "perly.y"
 { yyval.opval = Nullop; }
 break;
 case 27:
-#line 199 "perly.y"
+#line 223 "perly.y"
 { yyval.opval = scope(yyvsp[0].opval); }
 break;
 case 28:
-#line 203 "perly.y"
+#line 227 "perly.y"
 { PL_copline = yyvsp[-6].ival;
                            yyval.opval = block_end(yyvsp[-4].ival,
                                   newSTATEOP(0, yyvsp[-7].pval,
@@ -1696,7 +1699,7 @@ case 28:
                                                yyvsp[-6].ival, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); }
 break;
 case 29:
-#line 209 "perly.y"
+#line 233 "perly.y"
 { PL_copline = yyvsp[-6].ival;
                            yyval.opval = block_end(yyvsp[-4].ival,
                                   newSTATEOP(0, yyvsp[-7].pval,
@@ -1704,23 +1707,23 @@ case 29:
                                                yyvsp[-6].ival, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); }
 break;
 case 30:
-#line 215 "perly.y"
+#line 239 "perly.y"
 { yyval.opval = block_end(yyvsp[-6].ival,
                                 newFOROP(0, yyvsp[-9].pval, yyvsp[-8].ival, yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
 break;
 case 31:
-#line 218 "perly.y"
+#line 242 "perly.y"
 { yyval.opval = block_end(yyvsp[-4].ival,
                                 newFOROP(0, yyvsp[-8].pval, yyvsp[-7].ival, mod(yyvsp[-6].opval, OP_ENTERLOOP),
                                          yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
 break;
 case 32:
-#line 222 "perly.y"
+#line 246 "perly.y"
 { yyval.opval = block_end(yyvsp[-4].ival,
                                 newFOROP(0, yyvsp[-7].pval, yyvsp[-6].ival, Nullop, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
 break;
 case 33:
-#line 226 "perly.y"
+#line 250 "perly.y"
 { OP *forop = append_elem(OP_LINESEQ,
                                        scalar(yyvsp[-6].opval),
                                        newWHILEOP(0, 1, (LOOP*)Nullop,
@@ -1730,427 +1733,459 @@ case 33:
                          yyval.opval = block_end(yyvsp[-7].ival, newSTATEOP(0, yyvsp[-10].pval, forop)); }
 break;
 case 34:
-#line 234 "perly.y"
+#line 258 "perly.y"
 { yyval.opval = newSTATEOP(0, yyvsp[-2].pval,
                                 newWHILEOP(0, 1, (LOOP*)Nullop,
                                            NOLINE, Nullop, yyvsp[-1].opval, yyvsp[0].opval)); }
 break;
 case 35:
-#line 240 "perly.y"
+#line 264 "perly.y"
 { yyval.opval = Nullop; }
 break;
 case 37:
-#line 245 "perly.y"
+#line 269 "perly.y"
 { (void)scan_num("1"); yyval.opval = yylval.opval; }
 break;
 case 39:
-#line 250 "perly.y"
+#line 274 "perly.y"
 { yyval.opval = invert(scalar(yyvsp[0].opval)); }
 break;
 case 40:
-#line 254 "perly.y"
+#line 278 "perly.y"
 { yyval.opval = yyvsp[0].opval; intro_my(); }
 break;
 case 41:
-#line 258 "perly.y"
+#line 282 "perly.y"
 { yyval.opval = yyvsp[0].opval; intro_my(); }
 break;
 case 42:
-#line 262 "perly.y"
+#line 286 "perly.y"
 { yyval.opval = yyvsp[0].opval; intro_my(); }
 break;
 case 43:
-#line 266 "perly.y"
+#line 290 "perly.y"
 { yyval.opval = yyvsp[0].opval; intro_my(); }
 break;
 case 44:
-#line 270 "perly.y"
+#line 294 "perly.y"
 { yyval.pval = Nullch; }
 break;
 case 46:
-#line 275 "perly.y"
+#line 299 "perly.y"
 { yyval.ival = 0; }
 break;
 case 47:
-#line 277 "perly.y"
+#line 301 "perly.y"
 { yyval.ival = 0; }
 break;
 case 48:
-#line 279 "perly.y"
+#line 303 "perly.y"
 { yyval.ival = 0; }
 break;
 case 49:
-#line 281 "perly.y"
+#line 305 "perly.y"
 { yyval.ival = 0; }
 break;
 case 50:
-#line 285 "perly.y"
-{ newFORM(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
+#line 307 "perly.y"
+{ yyval.ival = 0; }
 break;
 case 51:
-#line 288 "perly.y"
-{ yyval.opval = yyvsp[0].opval; }
+#line 311 "perly.y"
+{ newFORM(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
 break;
 case 52:
-#line 289 "perly.y"
-{ yyval.opval = Nullop; }
+#line 314 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
 break;
 case 53:
-#line 293 "perly.y"
-{ newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
+#line 315 "perly.y"
+{ yyval.opval = Nullop; }
 break;
 case 54:
-#line 297 "perly.y"
-{ yyval.ival = start_subparse(FALSE, 0); }
+#line 319 "perly.y"
+{ newMYSUB(yyvsp[-4].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
 break;
 case 55:
-#line 301 "perly.y"
-{ yyval.ival = start_subparse(FALSE, CVf_ANON); }
+#line 323 "perly.y"
+{ newATTRSUB(yyvsp[-4].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
 break;
 case 56:
-#line 305 "perly.y"
-{ yyval.ival = start_subparse(TRUE, 0); }
+#line 327 "perly.y"
+{ yyval.ival = start_subparse(FALSE, 0); }
 break;
 case 57:
-#line 308 "perly.y"
+#line 331 "perly.y"
+{ yyval.ival = start_subparse(FALSE, CVf_ANON); }
+break;
+case 58:
+#line 335 "perly.y"
+{ yyval.ival = start_subparse(TRUE, 0); }
+break;
+case 59:
+#line 338 "perly.y"
 { STRLEN n_a; char *name = SvPV(((SVOP*)yyvsp[0].opval)->op_sv,n_a);
                          if (strEQ(name, "BEGIN") || strEQ(name, "END")
                              || strEQ(name, "INIT"))
                              CvSPECIAL_on(PL_compcv);
                          yyval.opval = yyvsp[0].opval; }
 break;
-case 58:
-#line 316 "perly.y"
+case 60:
+#line 346 "perly.y"
 { yyval.opval = Nullop; }
 break;
-case 60:
-#line 320 "perly.y"
+case 62:
+#line 351 "perly.y"
+{ yyval.opval = Nullop; }
+break;
+case 63:
+#line 353 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 64:
+#line 355 "perly.y"
+{ yyval.opval = Nullop; }
+break;
+case 65:
+#line 359 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 61:
-#line 321 "perly.y"
+case 66:
+#line 361 "perly.y"
+{ yyval.opval = Nullop; }
+break;
+case 67:
+#line 364 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 68:
+#line 365 "perly.y"
 { yyval.opval = Nullop; PL_expect = XSTATE; }
 break;
-case 62:
-#line 325 "perly.y"
+case 69:
+#line 369 "perly.y"
 { package(yyvsp[-1].opval); }
 break;
-case 63:
-#line 327 "perly.y"
+case 70:
+#line 371 "perly.y"
 { package(Nullop); }
 break;
-case 64:
-#line 331 "perly.y"
+case 71:
+#line 375 "perly.y"
 { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
 break;
-case 65:
-#line 333 "perly.y"
+case 72:
+#line 377 "perly.y"
 { utilize(yyvsp[-6].ival, yyvsp[-5].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval); }
 break;
-case 66:
-#line 337 "perly.y"
+case 73:
+#line 381 "perly.y"
 { yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 67:
-#line 339 "perly.y"
+case 74:
+#line 383 "perly.y"
 { yyval.opval = newLOGOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 69:
-#line 344 "perly.y"
+case 76:
+#line 388 "perly.y"
 { yyval.opval = yyvsp[-1].opval; }
 break;
-case 70:
-#line 346 "perly.y"
+case 77:
+#line 390 "perly.y"
 { yyval.opval = append_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 72:
-#line 351 "perly.y"
+case 79:
+#line 395 "perly.y"
 { yyval.opval = convert(yyvsp[-2].ival, OPf_STACKED,
                                prepend_elem(OP_LIST, newGVREF(yyvsp[-2].ival,yyvsp[-1].opval), yyvsp[0].opval) ); }
 break;
-case 73:
-#line 354 "perly.y"
+case 80:
+#line 398 "perly.y"
 { yyval.opval = convert(yyvsp[-4].ival, OPf_STACKED,
                                prepend_elem(OP_LIST, newGVREF(yyvsp[-4].ival,yyvsp[-2].opval), yyvsp[-1].opval) ); }
 break;
-case 74:
-#line 357 "perly.y"
+case 81:
+#line 401 "perly.y"
 { yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST,
                                    prepend_elem(OP_LIST, scalar(yyvsp[-5].opval), yyvsp[-1].opval),
                                    newUNOP(OP_METHOD, 0, yyvsp[-3].opval))); }
 break;
-case 75:
-#line 362 "perly.y"
+case 82:
+#line 406 "perly.y"
 { yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST, scalar(yyvsp[-2].opval),
                                    newUNOP(OP_METHOD, 0, yyvsp[0].opval))); }
 break;
-case 76:
-#line 366 "perly.y"
+case 83:
+#line 410 "perly.y"
 { yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST,
                                    prepend_elem(OP_LIST, yyvsp[-1].opval, yyvsp[0].opval),
                                    newUNOP(OP_METHOD, 0, yyvsp[-2].opval))); }
 break;
-case 77:
-#line 371 "perly.y"
+case 84:
+#line 415 "perly.y"
 { yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST,
                                    prepend_elem(OP_LIST, yyvsp[-3].opval, yyvsp[-1].opval),
                                    newUNOP(OP_METHOD, 0, yyvsp[-4].opval))); }
 break;
-case 78:
-#line 376 "perly.y"
+case 85:
+#line 420 "perly.y"
 { yyval.opval = convert(yyvsp[-1].ival, 0, yyvsp[0].opval); }
 break;
-case 79:
-#line 378 "perly.y"
+case 86:
+#line 422 "perly.y"
 { yyval.opval = convert(yyvsp[-3].ival, 0, yyvsp[-1].opval); }
 break;
-case 80:
-#line 380 "perly.y"
-{ yyvsp[0].opval = newANONSUB(yyvsp[-1].ival, 0, yyvsp[0].opval); }
+case 87:
+#line 424 "perly.y"
+{ yyvsp[0].opval = newANONATTRSUB(yyvsp[-1].ival, 0, Nullop, yyvsp[0].opval); }
 break;
-case 81:
-#line 382 "perly.y"
+case 88:
+#line 426 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                 append_elem(OP_LIST,
                                   prepend_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval), yyvsp[-4].opval)); }
 break;
-case 84:
-#line 392 "perly.y"
+case 91:
+#line 436 "perly.y"
 { yyval.opval = newBINOP(OP_GELEM, 0, yyvsp[-4].opval, scalar(yyvsp[-2].opval)); }
 break;
-case 85:
-#line 394 "perly.y"
+case 92:
+#line 438 "perly.y"
 { yyval.opval = newBINOP(OP_AELEM, 0, oopsAV(yyvsp[-3].opval), scalar(yyvsp[-1].opval)); }
 break;
-case 86:
-#line 396 "perly.y"
+case 93:
+#line 440 "perly.y"
 { yyval.opval = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF(yyvsp[-4].opval),OP_RV2AV),
                                        scalar(yyvsp[-1].opval));}
 break;
-case 87:
-#line 400 "perly.y"
+case 94:
+#line 444 "perly.y"
 { yyval.opval = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF(yyvsp[-3].opval),OP_RV2AV),
                                        scalar(yyvsp[-1].opval));}
 break;
-case 88:
-#line 404 "perly.y"
+case 95:
+#line 448 "perly.y"
 { yyval.opval = newBINOP(OP_HELEM, 0, oopsHV(yyvsp[-4].opval), jmaybe(yyvsp[-2].opval));
                            PL_expect = XOPERATOR; }
 break;
-case 89:
-#line 407 "perly.y"
+case 96:
+#line 451 "perly.y"
 { yyval.opval = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF(yyvsp[-5].opval),OP_RV2HV),
                                        jmaybe(yyvsp[-2].opval));
                            PL_expect = XOPERATOR; }
 break;
-case 90:
-#line 412 "perly.y"
+case 97:
+#line 456 "perly.y"
 { yyval.opval = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF(yyvsp[-4].opval),OP_RV2HV),
                                        jmaybe(yyvsp[-2].opval));
                            PL_expect = XOPERATOR; }
 break;
-case 91:
-#line 417 "perly.y"
+case 98:
+#line 461 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar(yyvsp[-3].opval))); }
 break;
-case 92:
-#line 420 "perly.y"
+case 99:
+#line 464 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   append_elem(OP_LIST, yyvsp[-1].opval,
                                       newCVREF(0, scalar(yyvsp[-4].opval)))); }
 break;
-case 93:
-#line 425 "perly.y"
+case 100:
+#line 469 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   append_elem(OP_LIST, yyvsp[-1].opval,
                                               newCVREF(0, scalar(yyvsp[-3].opval)))); }
 break;
-case 94:
-#line 429 "perly.y"
+case 101:
+#line 473 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar(yyvsp[-2].opval))); }
 break;
-case 95:
-#line 435 "perly.y"
+case 102:
+#line 479 "perly.y"
 { yyval.opval = newASSIGNOP(OPf_STACKED, yyvsp[-2].opval, yyvsp[-1].ival, yyvsp[0].opval); }
 break;
-case 96:
-#line 437 "perly.y"
+case 103:
+#line 481 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 97:
-#line 439 "perly.y"
+case 104:
+#line 483 "perly.y"
 {   if (yyvsp[-1].ival != OP_REPEAT)
                                scalar(yyvsp[-2].opval);
                            yyval.opval = newBINOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, scalar(yyvsp[0].opval)); }
 break;
-case 98:
-#line 443 "perly.y"
+case 105:
+#line 487 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 99:
-#line 445 "perly.y"
+case 106:
+#line 489 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 100:
-#line 447 "perly.y"
+case 107:
+#line 491 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 101:
-#line 449 "perly.y"
+case 108:
+#line 493 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 102:
-#line 451 "perly.y"
+case 109:
+#line 495 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 103:
-#line 453 "perly.y"
+case 110:
+#line 497 "perly.y"
 { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
 break;
-case 104:
-#line 455 "perly.y"
+case 111:
+#line 499 "perly.y"
 { yyval.opval = newRANGE(yyvsp[-1].ival, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval));}
 break;
-case 105:
-#line 457 "perly.y"
+case 112:
+#line 501 "perly.y"
 { yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 106:
-#line 459 "perly.y"
+case 113:
+#line 503 "perly.y"
 { yyval.opval = newLOGOP(OP_OR, 0, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 107:
-#line 461 "perly.y"
+case 114:
+#line 505 "perly.y"
 { yyval.opval = newCONDOP(0, yyvsp[-4].opval, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 108:
-#line 463 "perly.y"
+case 115:
+#line 507 "perly.y"
 { yyval.opval = bind_match(yyvsp[-1].ival, yyvsp[-2].opval, yyvsp[0].opval); }
 break;
-case 109:
-#line 466 "perly.y"
+case 116:
+#line 510 "perly.y"
 { yyval.opval = newUNOP(OP_NEGATE, 0, scalar(yyvsp[0].opval)); }
 break;
-case 110:
-#line 468 "perly.y"
+case 117:
+#line 512 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 111:
-#line 470 "perly.y"
+case 118:
+#line 514 "perly.y"
 { yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); }
 break;
-case 112:
-#line 472 "perly.y"
+case 119:
+#line 516 "perly.y"
 { yyval.opval = newUNOP(OP_COMPLEMENT, 0, scalar(yyvsp[0].opval));}
 break;
-case 113:
-#line 474 "perly.y"
+case 120:
+#line 518 "perly.y"
 { yyval.opval = newUNOP(OP_REFGEN, 0, mod(yyvsp[0].opval,OP_REFGEN)); }
 break;
-case 114:
-#line 476 "perly.y"
+case 121:
+#line 520 "perly.y"
 { yyval.opval = newUNOP(OP_POSTINC, 0,
                                        mod(scalar(yyvsp[-1].opval), OP_POSTINC)); }
 break;
-case 115:
-#line 479 "perly.y"
+case 122:
+#line 523 "perly.y"
 { yyval.opval = newUNOP(OP_POSTDEC, 0,
                                        mod(scalar(yyvsp[-1].opval), OP_POSTDEC)); }
 break;
-case 116:
-#line 482 "perly.y"
+case 123:
+#line 526 "perly.y"
 { yyval.opval = newUNOP(OP_PREINC, 0,
                                        mod(scalar(yyvsp[0].opval), OP_PREINC)); }
 break;
-case 117:
-#line 485 "perly.y"
+case 124:
+#line 529 "perly.y"
 { yyval.opval = newUNOP(OP_PREDEC, 0,
                                        mod(scalar(yyvsp[0].opval), OP_PREDEC)); }
 break;
-case 118:
-#line 488 "perly.y"
+case 125:
+#line 532 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 126:
+#line 534 "perly.y"
 { yyval.opval = localize(yyvsp[0].opval,yyvsp[-1].ival); }
 break;
-case 119:
-#line 490 "perly.y"
+case 127:
+#line 536 "perly.y"
 { yyval.opval = sawparens(yyvsp[-1].opval); }
 break;
-case 120:
-#line 492 "perly.y"
+case 128:
+#line 538 "perly.y"
 { yyval.opval = sawparens(newNULLLIST()); }
 break;
-case 121:
-#line 494 "perly.y"
+case 129:
+#line 540 "perly.y"
 { yyval.opval = newANONLIST(yyvsp[-1].opval); }
 break;
-case 122:
-#line 496 "perly.y"
+case 130:
+#line 542 "perly.y"
 { yyval.opval = newANONLIST(Nullop); }
 break;
-case 123:
-#line 498 "perly.y"
+case 131:
+#line 544 "perly.y"
 { yyval.opval = newANONHASH(yyvsp[-2].opval); }
 break;
-case 124:
-#line 500 "perly.y"
+case 132:
+#line 546 "perly.y"
 { yyval.opval = newANONHASH(Nullop); }
 break;
-case 125:
-#line 502 "perly.y"
-{ yyval.opval = newANONSUB(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
+case 133:
+#line 548 "perly.y"
+{ yyval.opval = newANONATTRSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
 break;
-case 126:
-#line 504 "perly.y"
+case 134:
+#line 550 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 127:
-#line 506 "perly.y"
+case 135:
+#line 552 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 128:
-#line 508 "perly.y"
+case 136:
+#line 554 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 129:
-#line 510 "perly.y"
+case 137:
+#line 556 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 130:
-#line 512 "perly.y"
+case 138:
+#line 558 "perly.y"
 { yyval.opval = newUNOP(OP_AV2ARYLEN, 0, ref(yyvsp[0].opval, OP_AV2ARYLEN));}
 break;
-case 131:
-#line 514 "perly.y"
+case 139:
+#line 560 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 132:
-#line 516 "perly.y"
+case 140:
+#line 562 "perly.y"
 { yyval.opval = newSLICEOP(0, yyvsp[-1].opval, yyvsp[-4].opval); }
 break;
-case 133:
-#line 518 "perly.y"
+case 141:
+#line 564 "perly.y"
 { yyval.opval = newSLICEOP(0, yyvsp[-1].opval, Nullop); }
 break;
-case 134:
-#line 520 "perly.y"
+case 142:
+#line 566 "perly.y"
 { yyval.opval = prepend_elem(OP_ASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_ASLICE, 0,
                                        list(yyvsp[-1].opval),
                                        ref(yyvsp[-3].opval, OP_ASLICE))); }
 break;
-case 135:
-#line 526 "perly.y"
+case 143:
+#line 572 "perly.y"
 { yyval.opval = prepend_elem(OP_HSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_HSLICE, 0,
@@ -2158,38 +2193,38 @@ case 135:
                                        ref(oopsHV(yyvsp[-4].opval), OP_HSLICE)));
                            PL_expect = XOPERATOR; }
 break;
-case 136:
-#line 533 "perly.y"
+case 144:
+#line 579 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 137:
-#line 535 "perly.y"
+case 145:
+#line 581 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, 0, scalar(yyvsp[0].opval)); }
 break;
-case 138:
-#line 537 "perly.y"
+case 146:
+#line 583 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar(yyvsp[-2].opval)); }
 break;
-case 139:
-#line 539 "perly.y"
+case 147:
+#line 585 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            append_elem(OP_LIST, yyvsp[-1].opval, scalar(yyvsp[-3].opval))); }
 break;
-case 140:
-#line 542 "perly.y"
+case 148:
+#line 588 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); }
 break;
-case 141:
-#line 545 "perly.y"
+case 149:
+#line 591 "perly.y"
 { yyval.opval = dofile(yyvsp[0].opval); }
 break;
-case 142:
-#line 547 "perly.y"
+case 150:
+#line 593 "perly.y"
 { yyval.opval = newUNOP(OP_NULL, OPf_SPECIAL, scope(yyvsp[0].opval)); }
 break;
-case 143:
-#line 549 "perly.y"
+case 151:
+#line 595 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB,
                            OPf_SPECIAL|OPf_STACKED,
                            prepend_elem(OP_LIST,
@@ -2198,8 +2233,8 @@ case 143:
                                    scalar(yyvsp[-2].opval)
                                )),Nullop)); dep();}
 break;
-case 144:
-#line 557 "perly.y"
+case 152:
+#line 603 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB,
                            OPf_SPECIAL|OPf_STACKED,
                            append_elem(OP_LIST,
@@ -2209,151 +2244,171 @@ case 144:
                                    scalar(yyvsp[-3].opval)
                                )))); dep();}
 break;
-case 145:
-#line 566 "perly.y"
+case 153:
+#line 612 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
                            prepend_elem(OP_LIST,
                                scalar(newCVREF(0,scalar(yyvsp[-2].opval))), Nullop)); dep();}
 break;
-case 146:
-#line 570 "perly.y"
+case 154:
+#line 616 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
                            prepend_elem(OP_LIST,
                                yyvsp[-1].opval,
                                scalar(newCVREF(0,scalar(yyvsp[-3].opval))))); dep();}
 break;
-case 147:
-#line 575 "perly.y"
+case 155:
+#line 621 "perly.y"
 { yyval.opval = newOP(yyvsp[0].ival, OPf_SPECIAL);
                            PL_hints |= HINT_BLOCK_SCOPE; }
 break;
-case 148:
-#line 578 "perly.y"
+case 156:
+#line 624 "perly.y"
 { yyval.opval = newLOOPEX(yyvsp[-1].ival,yyvsp[0].opval); }
 break;
-case 149:
-#line 580 "perly.y"
+case 157:
+#line 626 "perly.y"
 { yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); }
 break;
-case 150:
-#line 582 "perly.y"
+case 158:
+#line 628 "perly.y"
 { yyval.opval = newOP(yyvsp[0].ival, 0); }
 break;
-case 151:
-#line 584 "perly.y"
+case 159:
+#line 630 "perly.y"
 { yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); }
 break;
-case 152:
-#line 586 "perly.y"
+case 160:
+#line 632 "perly.y"
 { yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); }
 break;
-case 153:
-#line 588 "perly.y"
+case 161:
+#line 634 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); }
 break;
-case 154:
-#line 591 "perly.y"
+case 162:
+#line 637 "perly.y"
 { yyval.opval = newOP(yyvsp[0].ival, 0); }
 break;
-case 155:
-#line 593 "perly.y"
+case 163:
+#line 639 "perly.y"
 { yyval.opval = newOP(yyvsp[-2].ival, 0); }
 break;
-case 156:
-#line 595 "perly.y"
+case 164:
+#line 641 "perly.y"
 { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                scalar(yyvsp[0].opval)); }
 break;
-case 157:
-#line 598 "perly.y"
+case 165:
+#line 644 "perly.y"
 { yyval.opval = newOP(yyvsp[-2].ival, OPf_SPECIAL); }
 break;
-case 158:
-#line 600 "perly.y"
+case 166:
+#line 646 "perly.y"
 { yyval.opval = newUNOP(yyvsp[-3].ival, 0, yyvsp[-1].opval); }
 break;
-case 159:
-#line 602 "perly.y"
+case 167:
+#line 648 "perly.y"
 { yyval.opval = pmruntime(yyvsp[-3].opval, yyvsp[-1].opval, Nullop); }
 break;
-case 160:
-#line 604 "perly.y"
+case 168:
+#line 650 "perly.y"
 { yyval.opval = pmruntime(yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval); }
 break;
-case 163:
-#line 610 "perly.y"
-{ yyval.opval = Nullop; }
+case 171:
+#line 656 "perly.y"
+{ yyval.opval = my_attrs(yyvsp[-1].opval,yyvsp[0].opval); }
 break;
-case 164:
-#line 612 "perly.y"
+case 172:
+#line 658 "perly.y"
+{ yyval.opval = localize(yyvsp[0].opval,yyvsp[-1].ival); }
+break;
+case 173:
+#line 662 "perly.y"
+{ yyval.opval = sawparens(yyvsp[-1].opval); }
+break;
+case 174:
+#line 664 "perly.y"
+{ yyval.opval = sawparens(newNULLLIST()); }
+break;
+case 175:
+#line 666 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 165:
-#line 616 "perly.y"
+case 176:
+#line 668 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 177:
+#line 670 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 178:
+#line 674 "perly.y"
 { yyval.opval = Nullop; }
 break;
-case 166:
-#line 618 "perly.y"
+case 179:
+#line 676 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-case 167:
-#line 620 "perly.y"
-{ yyval.opval = yyvsp[-1].opval; }
+case 180:
+#line 680 "perly.y"
+{ yyval.opval = Nullop; }
 break;
-case 168:
-#line 623 "perly.y"
-{ yyval.ival = 0; }
+case 181:
+#line 682 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
 break;
-case 169:
-#line 624 "perly.y"
-{ yyval.ival = 1; }
+case 182:
+#line 684 "perly.y"
+{ yyval.opval = yyvsp[-1].opval; }
 break;
-case 170:
-#line 628 "perly.y"
+case 183:
+#line 688 "perly.y"
 { PL_in_my = 0; yyval.opval = my(yyvsp[0].opval); }
 break;
-case 171:
-#line 632 "perly.y"
+case 184:
+#line 692 "perly.y"
 { yyval.opval = newCVREF(yyvsp[-1].ival,yyvsp[0].opval); }
 break;
-case 172:
-#line 636 "perly.y"
+case 185:
+#line 696 "perly.y"
 { yyval.opval = newSVREF(yyvsp[0].opval); }
 break;
-case 173:
-#line 640 "perly.y"
+case 186:
+#line 700 "perly.y"
 { yyval.opval = newAVREF(yyvsp[0].opval); }
 break;
-case 174:
-#line 644 "perly.y"
+case 187:
+#line 704 "perly.y"
 { yyval.opval = newHVREF(yyvsp[0].opval); }
 break;
-case 175:
-#line 648 "perly.y"
+case 188:
+#line 708 "perly.y"
 { yyval.opval = newAVREF(yyvsp[0].opval); }
 break;
-case 176:
-#line 652 "perly.y"
+case 189:
+#line 712 "perly.y"
 { yyval.opval = newGVREF(0,yyvsp[0].opval); }
 break;
-case 177:
-#line 656 "perly.y"
+case 190:
+#line 716 "perly.y"
 { yyval.opval = scalar(yyvsp[0].opval); }
 break;
-case 178:
-#line 658 "perly.y"
+case 191:
+#line 718 "perly.y"
 { yyval.opval = scalar(yyvsp[0].opval);  }
 break;
-case 179:
-#line 660 "perly.y"
+case 192:
+#line 720 "perly.y"
 { yyval.opval = scope(yyvsp[0].opval); }
 break;
-case 180:
-#line 663 "perly.y"
+case 193:
+#line 723 "perly.y"
 { yyval.opval = yyvsp[0].opval; }
 break;
-#line 2365 "perly.c"
+#line 2412 "perly.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
@@ -2364,8 +2419,8 @@ break;
 #if YYDEBUG
         if (yydebug)
             PerlIO_printf(Perl_debug_log,
-               "yydebug: after reduction, shifting from state 0 to state %d\n",
-               YYFINAL);
+                         "yydebug: after reduction, shifting from state 0 to state %d\n",
+                         YYFINAL);
 #endif
         yystate = YYFINAL;
         *++yyssp = YYFINAL;
@@ -2395,8 +2450,8 @@ break;
 #if YYDEBUG
     if (yydebug)
         PerlIO_printf(Perl_debug_log,
-           "yydebug: after reduction, shifting from state %d to state %d\n",
-           *yyssp, yystate);
+                     "yydebug: after reduction, shifting from state %d to state %d\n",
+                     *yyssp, yystate);
 #endif
     if (yyssp >= yyss + yystacksize - 1)
     {
@@ -2407,10 +2462,8 @@ break;
        int yyps_index = (yyssp - yyss);
        int yypv_index = (yyvsp - yyvs);
        yystacksize += YYSTACKSIZE;
-       ysave->yyvs = yyvs =
-           (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
-       ysave->yyss = yyss =
-           (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short));
+       ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+       ysave->yyss = Renew(yyss, yystacksize, short);
        if (!yyvs || !yyss)
            goto yyoverflow;
        yyssp = yyss + yyps_index;
index afe1a38..daa558e 100755 (executable)
@@ -21,15 +21,34 @@ tmp=/tmp/f$$
 
 if grep 'yaccpar 1.8 (Berkeley)' $input >/dev/null 2>&1; then
     cp $input $output
+    # Don't expect the diff to do everything -- do some by hand
     if test -f perly_c.diff; then
        patch -F3 $output <perly_c.diff
+       sed -e '/^[     ]*printf("yydebug:/s/printf(/PerlIO_printf(Perl_debug_log, /' \
+           -e '/^#line /s/"y[.]tab[.]c"/"perly.c"/' \
+           -e '/\[\] *= *[{]/s/^/static /' \
+           -e '/^static static/s/^static //' \
+           -e '/^#define.WORD/,/^#define.ARROW/d' \
+           -e '/^int.yydebug/,/^#define.yystacksize/d' \
+           < $output > $tmp && mv -f $tmp $output || exit 1
        rm -rf $input
+       echo "If you need to debug perly.c, you need to fix up the #line"
+       echo "directives yourself."
     fi
     exit
 elif grep 'yaccpar     1.9 (Berkeley)' $input >/dev/null 2>&1; then
     if test -f perly.c.dif9; then
        patch -F3 $output <perly.c.dif9
+       sed -e '/^[     ]*printf("yydebug:/s/printf(/PerlIO_printf(Perl_debug_log, /' \
+           -e '/^#line /s/"y[.]tab[.]c"/"perly.c"/' \
+           -e '/\[\] *= *[{]/s/^/static /' \
+           -e '/^static static/s/^static //' \
+           -e '/^#define.WORD/,/^#define.ARROW/d' \
+           -e '/^int.yydebug/,/^#define.yystacksize/d' \
+           < $output > $tmp && mv -f $tmp $output || exit 1
        rm -rf $input
+       echo "If you need to debug perly.c, you need to fix up the #line"
+       echo "directives yourself."
        exit 0
     else
        echo "Diffs from byacc-1.9 are not available."
@@ -90,7 +109,7 @@ case "$plan" in
     # Also added are out of memory checks (makes porting the generated
     # code easier) For most systems, it can't hurt. -- TD
     "bsd43")
-       echo "Attempting to path perly.c to allow dynamic yacc stack allocation"
+       echo "Attempting to patch perly.c to allow dynamic yacc stack allocation"
        echo "Assuming bsd4.3 yaccpar"
        cat >$tmp <<'END'
 /YYSTYPE[      ]*yyv\[ *YYMAXDEPTH *\];/c\
@@ -145,7 +164,7 @@ END
 
     #######################################################
     "isc") # Interactive Systems 2.2  version
-       echo "Attempting to path perly.c to allow dynamic yacc stack allocation"
+       echo "Attempting to patch perly.c to allow dynamic yacc stack allocation"
        echo "Assuming Interactive SysVr3 2.2 yaccpar"
        # Easier to simply put whole script here than to modify the
        # bsd script with sed.
diff --git a/perly.h b/perly.h
index 14f5e92..15dfa0c 100644 (file)
--- a/perly.h
+++ b/perly.h
 #define NOAMP 294
 #define LOCAL 295
 #define MY 296
-#define PREC_LOW 297
-#define OROP 298
-#define ANDOP 299
-#define NOTOP 300
-#define ASSIGNOP 301
-#define OROR 302
-#define ANDAND 303
-#define BITOROP 304
-#define BITANDOP 305
-#define SHIFTOP 306
-#define MATCHOP 307
-#define UMINUS 308
-#define REFGEN 309
-#define POWOP 310
-#define PREINC 311
-#define PREDEC 312
-#define POSTINC 313
-#define POSTDEC 314
-#define ARROW 315
+#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 {
diff --git a/perly.y b/perly.y
index 9df012c..ddc0efc 100644 (file)
--- a/perly.y
+++ b/perly.y
 
 #define dep() deprecate("\"do\" to call subroutines")
 
+/* stuff included here to make perly_c.diff apply better */
+
+#define yydebug            PL_yydebug
+#define yynerrs            PL_yynerrs
+#define yyerrflag   PL_yyerrflag
+#define yychar     PL_yychar
+#define yyval      PL_yyval
+#define yylval     PL_yylval
+
+struct ysv {
+    short* yyss;
+    YYSTYPE* yyvs;
+    int oldyydebug;
+    int oldyynerrs;
+    int oldyyerrflag;
+    int oldyychar;
+    YYSTYPE oldyyval;
+    YYSTYPE oldyylval;
+};
+
+static void yydestruct(pTHXo_ void *ptr);
+
 %}
 
 %start prog
 
 %{
-/* I sense a Big Blue pattern here... */
-#if !defined(OEMVS) && !defined(__OPEN_VM) && !defined(POSIX_BC)
+#if 0 /* get this from perly.h instead */
 %}
 
 %union {
 }
 
 %{
-#endif /* !OEMVS && !__OPEN_VM && !POSIX_BC */
+#endif /* 0 */
 
 #ifdef USE_PURE_BISON
 #define YYLEX_PARAM (&yychar)
 #endif
+
 %}
 
 %token <ival> '{'
 %token <ival> FUNC0 FUNC1 FUNC UNIOP LSTOP
 %token <ival> RELOP EQOP MULOP ADDOP
 %token <ival> DOLSHARP DO HASHBRACK NOAMP
-%token LOCAL MY
+%token <ival> LOCAL MY MYSUB
+%token COLONATTR
 
-%type <ival> prog decl local format startsub startanonsub startformsub
+%type <ival> prog decl format startsub startanonsub startformsub
 %type <ival> remember mremember '&'
 %type <opval> block mblock lineseq line loop cond else
 %type <opval> expr term subscripted scalar ary hsh arylen star amper sideff
 %type <opval> argexpr nexpr texpr iexpr mexpr mnexpr mtexpr miexpr
 %type <opval> listexpr listexprcom indirob listop method
 %type <opval> formname subname proto subbody cont my_scalar
+%type <opval> subattrlist myattrlist mysubrout myattrterm myterm
 %type <pval> label
 
 %nonassoc PREC_LOW
@@ -275,6 +299,8 @@ decl        :       format
                        { $$ = 0; }
        |       subrout
                        { $$ = 0; }
+       |       mysubrout
+                       { $$ = 0; }
        |       package
                        { $$ = 0; }
        |       use
@@ -289,8 +315,12 @@ formname:  WORD            { $$ = $1; }
        |       /* NULL */      { $$ = Nullop; }
        ;
 
-subrout        :       SUB startsub subname proto subbody
-                       { newSUB($2, $3, $4, $5); }
+mysubrout:     MYSUB startsub subname proto subattrlist subbody
+                       { newMYSUB($2, $3, $4, $5, $6); }
+       ;
+
+subrout        :       SUB startsub subname proto subattrlist subbody
+                       { newATTRSUB($2, $3, $4, $5, $6); }
        ;
 
 startsub:      /* NULL */      /* start a regular subroutine scope */
@@ -317,6 +347,20 @@ proto      :       /* NULL */
        |       THING
        ;
 
+subattrlist:   /* NULL */
+                       { $$ = Nullop; }
+       |       COLONATTR THING
+                       { $$ = $2; }
+       |       COLONATTR
+                       { $$ = Nullop; }
+       ;
+
+myattrlist:    COLONATTR THING
+                       { $$ = $2; }
+       |       COLONATTR
+                       { $$ = Nullop; }
+       ;
+
 subbody        :       block   { $$ = $1; }
        |       ';'     { $$ = Nullop; PL_expect = XSTATE; }
        ;
@@ -377,7 +421,7 @@ listop      :       LSTOP indirob argexpr
        |       FUNC '(' listexprcom ')'
                        { $$ = convert($1, 0, $3); }
        |       LSTOPSUB startanonsub block
-                       { $3 = newANONSUB($2, 0, $3); }
+                       { $3 = newANONATTRSUB($2, 0, Nullop, $3); }
                    listexpr            %prec LSTOP
                        { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                 append_elem(OP_LIST,
@@ -484,7 +528,9 @@ term        :       term ASSIGNOP term
        |       PREDEC term
                        { $$ = newUNOP(OP_PREDEC, 0,
                                        mod(scalar($2), OP_PREDEC)); }
-       |       local term      %prec UNIOP
+       |       myattrterm      %prec UNIOP
+                       { $$ = $1; }
+       |       LOCAL term      %prec UNIOP
                        { $$ = localize($2,$1); }
        |       '(' expr ')'
                        { $$ = sawparens($2); }
@@ -498,8 +544,8 @@ term        :       term ASSIGNOP term
                        { $$ = newANONHASH($2); }
        |       HASHBRACK ';' '}'                               %prec '('
                        { $$ = newANONHASH(Nullop); }
-       |       ANONSUB startanonsub proto block                %prec '('
-                       { $$ = newANONSUB($2, $3, $4); }
+       |       ANONSUB startanonsub proto subattrlist block    %prec '('
+                       { $$ = newANONATTRSUB($2, $3, $4, $5); }
        |       scalar  %prec '('
                        { $$ = $1; }
        |       star    %prec '('
@@ -606,6 +652,24 @@ term       :       term ASSIGNOP term
        |       listop
        ;
 
+myattrterm:    MY myterm myattrlist
+                       { $$ = my_attrs($2,$3); }
+       |       MY myterm
+                       { $$ = localize($2,$1); }
+       ;
+
+myterm :       '(' expr ')'
+                       { $$ = sawparens($2); }
+       |       '(' ')'
+                       { $$ = sawparens(newNULLLIST()); }
+       |       scalar  %prec '('
+                       { $$ = $1; }
+       |       hsh     %prec '('
+                       { $$ = $1; }
+       |       ary     %prec '('
+                       { $$ = $1; }
+       ;
+
 listexpr:      /* NULL */ %prec PREC_LOW
                        { $$ = Nullop; }
        |       argexpr    %prec PREC_LOW
@@ -620,10 +684,6 @@ listexprcom:       /* NULL */
                        { $$ = $1; }
        ;
 
-local  :       LOCAL   { $$ = 0; }
-       |       MY      { $$ = 1; }
-       ;
-
 my_scalar:     scalar
                        { PL_in_my = 0; $$ = my($1); }
        ;
@@ -664,3 +724,11 @@ indirob    :       WORD
        ;
 
 %% /* PROGRAM */
+
+/* more stuff added to make perly_c.diff easier to apply */
+
+#ifdef yyparse
+#undef yyparse
+#endif
+#define yyparse() Perl_yyparse(pTHX)
+
index 463df80..7ade2f3 100644 (file)
-*** perly.c.orig       Mon Jul 26 03:27:57 1999
---- perly.c    Mon Jul 26 02:47:03 1999
+*** y.tab.c.orig       Thu Aug 26 22:31:26 1999
+--- y.tab.c    Thu Aug 26 22:32:22 1999
 ***************
-*** 8,91 ****
-  #include "perl.h"
-  
-  #define dep() deprecate("\"do\" to call subroutines")
-  
-! #line 27 "perly.y"
-! /* I sense a Big Blue pattern here... */
-! #if !defined(OEMVS) && !defined(__OPEN_VM) && !defined(POSIX_BC)
-! #line 31 "perly.y"
-! typedef union {
-!     I32      ival;
-!     char *pval;
-!     OP *opval;
-!     GV *gvval;
-! } YYSTYPE;
-! #line 39 "perly.y"
-! #endif /* !OEMVS && !__OPEN_VM && !POSIX_BC */
-  
-! #ifdef USE_PURE_BISON
-! #define YYLEX_PARAM (&yychar)
-! #endif
-! #line 29 "y.tab.c"
-! #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 PREC_LOW 297
-! #define OROP 298
-! #define ANDOP 299
-! #define NOTOP 300
-! #define ASSIGNOP 301
-! #define OROR 302
-! #define ANDAND 303
-! #define BITOROP 304
-! #define BITANDOP 305
-! #define SHIFTOP 306
-! #define MATCHOP 307
-! #define UMINUS 308
-! #define REFGEN 309
-! #define POWOP 310
-! #define PREINC 311
-! #define PREDEC 312
-! #define POSTINC 313
-! #define POSTDEC 314
-! #define ARROW 315
-  #define YYERRCODE 256
-! short yylhs[] = {                                        -1,
-     46,    0,    9,    7,   10,    8,   11,   11,   11,   12,
-     12,   12,   12,   25,   25,   25,   25,   25,   25,   25,
---- 8,25 ----
-  #include "perl.h"
-  
-+ #define yydebug          PL_yydebug
-+ #define yynerrs          PL_yynerrs
-+ #define yyerrflag   PL_yyerrflag
-+ #define yychar           PL_yychar
-+ #define yyval            PL_yyval
-+ #define yylval           PL_yylval
-+ 
-  #define dep() deprecate("\"do\" to call subroutines")
-  
-! static void yydestruct(pTHXo_ void *ptr);
-  
-! #line 27 "perly.y"
-  #define YYERRCODE 256
-! static short yylhs[] = {                                 -1,
-     46,    0,    9,    7,   10,    8,   11,   11,   11,   12,
-     12,   12,   12,   25,   25,   25,   25,   25,   25,   25,
-***************
-*** 107,111 ****
-     24,   19,   20,   21,   22,   23,   36,   36,   36,   36,
-  };
-! short yylen[] = {                                         2,
-      0,    2,    4,    0,    4,    0,    0,    2,    2,    2,
-      1,    2,    3,    1,    1,    3,    3,    3,    3,    3,
---- 41,45 ----
-     24,   19,   20,   21,   22,   23,   36,   36,   36,   36,
-  };
-! static short yylen[] = {                                  2,
-      0,    2,    4,    0,    4,    0,    0,    2,    2,    2,
-      1,    2,    3,    1,    1,    3,    3,    3,    3,    3,
-***************
-*** 127,131 ****
-      2,    2,    2,    2,    2,    2,    1,    1,    1,    1,
-  };
-! short yydefred[] = {                                      1,
-      0,    7,    0,   45,   56,   54,    0,   54,    8,   46,
-      9,   11,    0,   47,   48,   49,    0,    0,    0,   63,
---- 61,65 ----
-      2,    2,    2,    2,    2,    2,    1,    1,    1,    1,
-  };
-! static short yydefred[] = {                               1,
-      0,    7,    0,   45,   56,   54,    0,   54,    8,   46,
-      9,   11,    0,   47,   48,   49,    0,    0,    0,   63,
-***************
-*** 166,170 ****
-      5,    0,   30,    0,    0,   33,    0,   23,
-  };
-! short yydgoto[] = {                                       1,
-      9,   66,   10,   18,   96,   17,   87,  344,   90,  333,
-      3,   11,   12,   68,  349,  267,   70,   71,   72,   73,
---- 100,104 ----
-      5,    0,   30,    0,    0,   33,    0,   23,
-  };
-! static short yydgoto[] = {                                1,
-      9,   66,   10,   18,   96,   17,   87,  344,   90,  333,
-      3,   11,   12,   68,  349,  267,   70,   71,   72,   73,
-***************
-*** 174,178 ****
-    260,
-  };
-! short yysindex[] = {                                      0,
-      0,    0,  142,    0,    0,    0,  -57,    0,    0,    0,
-      0,    0,  622,    0,    0,    0, -239, -229,  -10,    0,
---- 108,112 ----
-    260,
-  };
-! static short yysindex[] = {                               0,
-      0,    0,  142,    0,    0,    0,  -57,    0,    0,    0,
-      0,    0,  622,    0,    0,    0, -239, -229,  -10,    0,
-***************
-*** 213,217 ****
-      0,  228,    0,   92,   92,    0, -204,    0,
-  };
-! short yyrindex[] = {                                      0,
-      0,    0,  225,    0,    0,    0,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,  155,    0,    0,    0,
---- 147,151 ----
-      0,  228,    0,   92,   92,    0, -204,    0,
-  };
-! static short yyrindex[] = {                               0,
-      0,    0,  225,    0,    0,    0,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,  155,    0,    0,    0,
-***************
-*** 252,256 ****
-      0,    0,    0,    0,    0,    0,  168,    0,
-  };
-! short yygindex[] = {                                      0,
-      0,    0,    0,  339,  320,    0,  -11,    0,  913,  360,
-    -78,    0,    0,    0, -320,  -13, 4321,    0, 1367,    0,
---- 186,190 ----
-      0,    0,    0,    0,    0,    0,  168,    0,
-  };
-! static short yygindex[] = {                               0,
-      0,    0,    0,  339,  320,    0,  -11,    0,  913,  360,
-    -78,    0,    0,    0, -320,  -13, 4321,    0, 1367,    0,
-***************
-*** 261,265 ****
-  };
-  #define YYTABLESIZE 4610
-! short yytable[] = {                                      69,
-    206,   20,  295,   62,  113,  257,  184,  103,  183,  298,
-    172,   62,  125,  104,  252,  350,  104,   81,  209,  169,
---- 195,199 ----
-  };
-  #define YYTABLESIZE 4610
-! static short yytable[] = {                               69,
-    206,   20,  295,   62,  113,  257,  184,  103,  183,  298,
-    172,   62,  125,  104,  252,  350,  104,   81,  209,  169,
-***************
-*** 724,728 ****
-      0,    0,    0,    0,    0,    0,    0,    0,    0,  321,
-  };
-! short yycheck[] = {                                      13,
-     59,   59,   59,   36,   43,  185,   92,   40,   87,   59,
-     91,   36,   51,   41,   59,  336,   44,  257,   41,   40,
---- 658,662 ----
-      0,    0,    0,    0,    0,    0,    0,    0,    0,  321,
-  };
-! static short yycheck[] = {                               13,
-     59,   59,   59,   36,   43,  185,   92,   40,   87,   59,
-     91,   36,   51,   41,   59,  336,   44,  257,   41,   40,
-***************
-*** 1193,1197 ****
-  #define YYMAXTOKEN 315
-  #if YYDEBUG
-! char *yyname[] = {
-  "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  "'!'",0,0,"'$'","'%'","'&'",0,"'('","')'","'*'","'+'","','","'-'",0,0,0,0,0,0,0,
---- 1127,1131 ----
-  #define YYMAXTOKEN 315
-  #if YYDEBUG
-! static char *yyname[] = {
-  "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-  "'!'",0,0,"'$'","'%'","'&'",0,"'('","')'","'*'","'+'","','","'-'",0,0,0,0,0,0,0,
-***************
-*** 1210,1214 ****
-  "POSTINC","POSTDEC","ARROW",
-  };
-! char *yyrule[] = {
-  "$accept : prog",
-  "$$1 :",
---- 1144,1148 ----
-  "POSTINC","POSTDEC","ARROW",
-  };
-! static char *yyrule[] = {
-  "$accept : prog",
-  "$$1 :",
-***************
-*** 1408,1436 ****
-  #endif
-  #endif
-- int yydebug;
-- int yynerrs;
-- int yyerrflag;
-- int yychar;
-- short *yyssp;
-- YYSTYPE *yyvsp;
-- YYSTYPE yyval;
-- YYSTYPE yylval;
-- short yyss[YYSTACKSIZE];
-- YYSTYPE yyvs[YYSTACKSIZE];
-- #define yystacksize YYSTACKSIZE
-  #line 666 "perly.y"
-   /* PROGRAM */
-! #line 1424 "y.tab.c"
-  #define YYABORT goto yyabort
-  #define YYACCEPT goto yyaccept
-  #define YYERROR goto yyerrlab
-  int
-! yyparse()
+*** 1447,1456 ****
+  yyparse()
   {
       register int yym, yyn, yystate;
   #if YYDEBUG
       register char *yys;
-      extern char *getenv();
+!     extern char *getenv();
   
       if (yys = getenv("YYDEBUG"))
       {
---- 1342,1391 ----
-  #endif
-  #endif
-  #line 666 "perly.y"
-   /* PROGRAM */
-! #line 1427 "perly.c"
-  #define YYABORT goto yyabort
-  #define YYACCEPT goto yyaccept
-  #define YYERROR goto yyerrlab
-+ 
-+ struct ysv {
-+     short* yyss;
-+     YYSTYPE* yyvs;
-+     int oldyydebug;
-+     int oldyynerrs;
-+     int oldyyerrflag;
-+     int oldyychar;
-+     YYSTYPE oldyyval;
-+     YYSTYPE oldyylval;
-+ };
-+ 
-  int
-! Perl_yyparse(pTHX)
+          yyn = *yys;
+--- 1447,1473 ----
+  yyparse()
   {
       register int yym, yyn, yystate;
 +     register short *yyssp;
 +     int retval = 0;
   #if YYDEBUG
       register char *yys;
-+ #ifndef __cplusplus
-      extern char *getenv();
-+ #endif
-+ #endif
-+ 
+! #endif
+  
 +     struct ysv *ysave;
 +     New(73, ysave, 1, struct ysv);
 +     SAVEDESTRUCTOR(yydestruct, ysave);
 +     ysave->oldyychar = yychar;
 +     ysave->oldyyval  = yyval;
 +     ysave->oldyylval = yylval;
-  
++   
 + #if YYDEBUG
       if (yys = getenv("YYDEBUG"))
       {
+          yyn = *yys;
 ***************
-*** 1445,1448 ****
---- 1400,1413 ----
+*** 1463,1468 ****
+--- 1480,1495 ----
+      yyerrflag = 0;
       yychar = (-1);
   
 +     /*
 + 
       yyssp = yyss;
       yyvsp = yyvs;
+      *yyssp = yystate = 0;
 ***************
-*** 1470,1479 ****
-  #if YYDEBUG
-          if (yydebug)
-!             printf("yydebug: state %d, shifting to state %d\n",
-                      yystate, yytable[yyn]);
+*** 1493,1499 ****
   #endif
           if (yyssp >= yyss + yystacksize - 1)
           {
 !             goto yyoverflow;
           }
           *++yyssp = yystate = yytable[yyn];
---- 1435,1458 ----
-  #if YYDEBUG
-          if (yydebug)
-!             PerlIO_printf(Perl_debug_log, "yydebug: state %d, shifting to state %d\n",
-                      yystate, yytable[yyn]);
+          *++yyvsp = yylval;
+--- 1520,1538 ----
   #endif
           if (yyssp >= yyss + yystacksize - 1)
           {
 !          int yyps_index = (yyssp - yyss);
 !          int yypv_index = (yyvsp - yyvs);
 !          yystacksize += YYSTACKSIZE;
-!          ysave->yyvs = yyvs =
-!              (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
-!          ysave->yyss = yyss =
-!              (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short));
+!          ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+!          ysave->yyss = Renew(yyss, yystacksize, short);
 !          if (!yyvs || !yyss)
 !              goto yyoverflow;
 !          yyssp = yyss + yyps_index;
 !          yyvsp = yyvs + yypv_index;
           }
           *++yyssp = yystate = yytable[yyn];
+          *++yyvsp = yylval;
 ***************
-*** 1511,1520 ****
-  #if YYDEBUG
-                  if (yydebug)
-!                     printf("yydebug: state %d, error recovery shifting\
-!  to state %d\n", *yyssp, yytable[yyn]);
+*** 1534,1540 ****
   #endif
                   if (yyssp >= yyss + yystacksize - 1)
                   {
 !                     goto yyoverflow;
                   }
                   *++yyssp = yystate = yytable[yyn];
---- 1490,1514 ----
-  #if YYDEBUG
-                  if (yydebug)
-!                     PerlIO_printf(Perl_debug_log,
-!                   "yydebug: state %d, error recovery shifting to state %d\n",
-!                   *yyssp, yytable[yyn]);
+                  *++yyvsp = yylval;
+--- 1573,1591 ----
   #endif
                   if (yyssp >= yyss + yystacksize - 1)
                   {
 !                  int yyps_index = (yyssp - yyss);
 !                  int yypv_index = (yyvsp - yyvs);
 !                  yystacksize += YYSTACKSIZE;
-!                  ysave->yyvs = yyvs = (YYSTYPE*)PerlMem_realloc((char*)yyvs,
-!                      yystacksize * sizeof(YYSTYPE));
-!                  ysave->yyss = yyss = (short*)PerlMem_realloc((char*)yyss,
-!                      yystacksize * sizeof(short));
+!                  ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+!                  ysave->yyss = Renew(yyss, yystacksize, short);
 !                  if (!yyvs || !yyss)
 !                      goto yyoverflow;
 !                  yyssp = yyss + yyps_index;
 !                  yyvsp = yyvs + yypv_index;
                   }
                   *++yyssp = yystate = yytable[yyn];
+                  *++yyvsp = yylval;
 ***************
-*** 1526,1531 ****
-  #if YYDEBUG
-                  if (yydebug)
-!                     printf("yydebug: error recovery discarding state %d\n",
-!                             *yyssp);
-  #endif
-                  if (yyssp <= yyss) goto yyabort;
---- 1520,1526 ----
-  #if YYDEBUG
-                  if (yydebug)
-!                     PerlIO_printf(Perl_debug_log,
-!                      "yydebug: error recovery discarding state %d\n",
-!                      *yyssp);
-  #endif
-                  if (yyssp <= yyss) goto yyabort;
-***************
-*** 1544,1549 ****
-              if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
-              if (!yys) yys = "illegal-symbol";
-!             printf("yydebug: state %d, error recovery discards token %d (%s)\n",
-!                     yystate, yychar, yys);
-          }
-  #endif
---- 1539,1545 ----
-              if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
-              if (!yys) yys = "illegal-symbol";
-!             PerlIO_printf(Perl_debug_log,
-!              "yydebug: state %d, error recovery discards token %d (%s)\n",
-!              yystate, yychar, yys);
-          }
-  #endif
-***************
-*** 1554,1558 ****
-  #if YYDEBUG
-      if (yydebug)
-!         printf("yydebug: state %d, reducing by rule %d (%s)\n",
-                  yystate, yyn, yyrule[yyn]);
-  #endif
---- 1550,1554 ----
-  #if YYDEBUG
-      if (yydebug)
-!         PerlIO_printf(Perl_debug_log, "yydebug: state %d, reducing by rule %d (%s)\n",
-                  yystate, yyn, yyrule[yyn]);
-  #endif
-***************
-*** 2358,2362 ****
-  { yyval.opval = yyvsp[0].opval; }
-  break;
-! #line 2361 "y.tab.c"
-      }
-      yyssp -= yym;
---- 2354,2358 ----
-  { yyval.opval = yyvsp[0].opval; }
-  break;
-! #line 2365 "perly.c"
-      }
-      yyssp -= yym;
-***************
-*** 2368,2373 ****
-  #if YYDEBUG
-          if (yydebug)
-!             printf("yydebug: after reduction, shifting from state 0 to\
-!  state %d\n", YYFINAL);
-  #endif
-          yystate = YYFINAL;
---- 2364,2370 ----
-  #if YYDEBUG
-          if (yydebug)
-!             PerlIO_printf(Perl_debug_log,
-!              "yydebug: after reduction, shifting from state 0 to state %d\n",
-!              YYFINAL);
-  #endif
-          yystate = YYFINAL;
-***************
-*** 2383,2387 ****
-                  if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
-                  if (!yys) yys = "illegal-symbol";
-!                 printf("yydebug: state %d, reading %d (%s)\n",
-                          YYFINAL, yychar, yys);
-              }
---- 2380,2384 ----
-                  if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
-                  if (!yys) yys = "illegal-symbol";
-!                 PerlIO_printf(Perl_debug_log, "yydebug: state %d, reading %d (%s)\n",
-                          YYFINAL, yychar, yys);
-              }
-***************
-*** 2398,2407 ****
-  #if YYDEBUG
-      if (yydebug)
-!         printf("yydebug: after reduction, shifting from state %d \
-! to state %d\n", *yyssp, yystate);
+*** 2473,2487 ****
   #endif
       if (yyssp >= yyss + yystacksize - 1)
       {
 !         goto yyoverflow;
       }
       *++yyssp = yystate;
---- 2395,2419 ----
-  #if YYDEBUG
-      if (yydebug)
-!         PerlIO_printf(Perl_debug_log,
-!          "yydebug: after reduction, shifting from state %d to state %d\n",
-!          *yyssp, yystate);
+      *++yyvsp = yyval;
+      goto yyloop;
+  yyoverflow:
+!     yyerror("yacc stack overflow");
+  yyabort:
+!     return (1);
+  yyaccept:
+!     return (0);
+  }
+--- 2524,2570 ----
   #endif
       if (yyssp >= yyss + yystacksize - 1)
       {
 !      int yyps_index = (yyssp - yyss);
 !      int yypv_index = (yyvsp - yyvs);
 !      yystacksize += YYSTACKSIZE;
-!      ysave->yyvs = yyvs =
-!          (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
-!      ysave->yyss = yyss =
-!          (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short));
+!      ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+!      ysave->yyss = Renew(yyss, yystacksize, short);
 !      if (!yyvs || !yyss)
 !          goto yyoverflow;
 !      yyssp = yyss + yyps_index;
 !      yyvsp = yyvs + yypv_index;
       }
       *++yyssp = yystate;
-***************
-*** 2409,2416 ****
-      goto yyloop;
-  yyoverflow:
-!     yyerror("yacc stack overflow");
-  yyabort:
-!     return (1);
-  yyaccept:
-!     return (0);
-  }
---- 2421,2448 ----
+      *++yyvsp = yyval;
       goto yyloop;
   yyoverflow:
 !     yyerror("Out of memory for yacc stack");
index 0cb375a..353c62d 100644 (file)
@@ -193,7 +193,7 @@ extension (not included with the standard Perl distribution) may also
 be of use.
  
 (Large file support is also related to 64-bit support, for obvious reasons)
+
 =head2 Better syntax checks on parenthesized unary operators
 
 Expressions such as:
@@ -269,9 +269,25 @@ 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 is guaranteed not to
+C<^_>, which may be used by user programs and are guaranteed not to
 acquire special meaning in any future version of Perl.
 
+=head2 C<use attrs> implicit in 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 a declaration syntax, like this:
+
+    sub mymethod : locked, method ;
+    ...
+    sub mymethod : locked, method {
+       ...
+    }
+
+F<AutoSplit.pm> and F<SelfLoader.pm> have been updated to keep the attributes
+with the stubs they provide.  See L<attributes>.
+
 =head1 Significant bug fixes
 
 =head2 E<lt>HANDLEE<gt> on empty files
@@ -364,26 +380,34 @@ EPOC is is now supported (on Psion 5).
 
 =over 4
 
-=item  op/io_const
+=item  lib/attrs
+
+Compatibility tests for C<sub : attrs> vs the older C<use attrs>.
+
+=item  lib/io_const
 
 IO constants (SEEK_*, _IO*).
 
-=item  op/io_dir
+=item  lib/io_dir
 
 Directory-related IO methods (new, read, close, rewind, tied delete).
 
-=item  op/io_multihomed
+=item  lib/io_multihomed
 
 INET sockets with multi-homed hosts.
 
-=item  op/io_poll
+=item  lib/io_poll
 
 IO poll().
 
-=item  op/io_unix
+=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.
@@ -400,6 +424,12 @@ Verify operations that access pad objects (lexicals and temporaries).
 
 =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 ByteLoader
 
 The ByteLoader is a dedication extension to generate and run
@@ -540,6 +570,10 @@ See L<perldbmfilter> for further information.
 
 =head2 Pragmata
 
+C<use attrs> is now obsolescent, 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>.
+
 C<use utf8> to enable UTF-8 and Unicode support.
 
 C<use caller 'encoding'> allows modules to inherit pragmatic attributes
@@ -579,6 +613,18 @@ A tutorial on managing class data for object modules.
 
 =head1 New Diagnostics
 
+=item "my sub" not yet implemented
+
+(F) Lexically scoped subroutines are not yet implemented.  Don't try that
+yet.
+
+=item %s package attribute may clash with future reserved word: %s
+
+(W) 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 /%s/: Unrecognized escape \\%c passed through
 
 (W) You used a backslash-character combination which is not recognized
@@ -593,16 +639,52 @@ intended it to be a read-write filehandle, you needed to open it with
 you intended only to read from the file, use "E<lt>".  See
 L<perlfunc/open>.
 
+=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 separator character %s in attribute list
+
+(F) Something other than a comma 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 Missing command in piped open
 
 (W) 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 Unrecognized escape \\%c passed through
 
 (W) You used a backslash-character combination which is not recognized
 by Perl.
 
+=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 defined(@array) is deprecated
 
 (D) defined() is not usually useful on arrays because it checks for an
@@ -615,6 +697,27 @@ just use C<if (@array) { # not empty }> for example.
 undefined I<scalar> value.  If you want to see if the hash is empty,
 just use C<if (%hash) { # not empty }> for example.  
 
+=item Invalid separator character %s in subroutine attribute list
+
+(F) Something other than a comma 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 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.
+
 =head1 Obsolete Diagnostics
 
 Todo.
index 7077088..cd9583b 100644 (file)
@@ -30,6 +30,11 @@ The symbols C<"%(-?@> sort before the letters, while C<[> and C<\> sort after.
 
 =over 4
 
+=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
@@ -174,6 +179,13 @@ regular expression engine didn't specifically check for that.  See L<perlre>.
 (S) The symbol in question was declared but somehow went out of scope
 before it could possibly have been used.
 
+=item %s package attribute may clash with future reserved word: %s
+
+(W) 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 %s syntax OK
 
 (F) The final summary message when a C<perl -c> succeeds.
@@ -297,7 +309,8 @@ 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>).
+to be an object method (see L<perlsub/"Subroutine Attributes">
+or L<attributes>).
 
 =item Args must match #! line
 
@@ -1530,7 +1543,7 @@ before the illegal character.
 
 (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 switch in PERL5OPT: %s
 
 (X) The PERL5OPT environment variable may only be used to set the
@@ -1614,6 +1627,16 @@ rebuild Perl.
 
 (P) Something went badly awry in the regular expression parser.
 
+=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 in regexp
 
 (F) The range specified in a character class had a minimum character
@@ -1625,6 +1648,13 @@ a literal character.  See L<perlre>.
 (W) Perl does not understand the given format conversion.
 See L<perlfunc/sprintf>.
 
+=item Invalid separator character %s in attribute list
+
+(F) Something other than a comma 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 type in pack: '%s'
 
 (F) The given character is not a valid pack type.  See L<perlfunc/pack>.
@@ -1756,6 +1786,11 @@ be created for some peculiar reason.
 (W) Multidimensional arrays aren't written like C<$foo[1,2,3]>.  They're written
 like C<$foo[1][2][3]>, as in C.
 
+=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 Name "%s::%s" used only once: possible typo
 
 (W) Typographical errors often show up as unique variable names.
@@ -3048,6 +3083,20 @@ 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 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 Use of $# is deprecated
 
 (D) This was an ill-advised attempt to emulate a poorly defined B<awk> feature.
index 004c0f4..d420059 100644 (file)
@@ -2366,6 +2366,8 @@ there is an error.  See also C<IPC::SysV> and C<IPC::SysV::Msg> documentation.
 
 =item my EXPR
 
+=item my EXPR : ATTRIBUTES
+
 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.  See
@@ -4338,10 +4340,10 @@ out the names of those files that contain a match:
 =item sub NAME BLOCK
 
 This is subroutine definition, not a real function I<per se>.  With just a
-NAME (and possibly prototypes), 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.
+NAME (and possibly prototypes or attributes), 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.
 
 =item substr EXPR,OFFSET,LENGTH,REPLACEMENT
 
index abfa657..bfc5223 100644 (file)
@@ -46,9 +46,13 @@ The following pragmas are defined (and have their own documentation).
 
 =over 12
 
+=item attributes
+
+set/get the attributes of a subroutine or variable
+
 =item attrs
 
-set/get attributes of a subroutine
+set/get attributes of a subroutine (obsolescent)
 
 =item autouse
 
index 2bd1cfd..47f507f 100644 (file)
@@ -6,16 +6,22 @@ perlsub - Perl subroutines
 
 To declare subroutines:
 
-    sub NAME;            # A "forward" declaration.
-    sub NAME(PROTO);     #  ditto, but with prototypes
+    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 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:
 
-    $subref = sub BLOCK;           # no proto
-    $subref = sub (PROTO) BLOCK;    # with proto
+    $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:
 
@@ -112,7 +118,7 @@ Example:
        ...
     }
 
-Asisng to a list of private variables to name your arguments:
+Assigning to a list of private variables to name your arguments:
 
     sub maybeset {
        my($key, $value) = @_;
@@ -196,7 +202,7 @@ 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.
 
-Function whose names are in all upper case are reserved to the Perl
+Functions whose names are in all upper case are reserved to the Perl
 core, as are modules whose names are in all lower case.  A
 function in all capitals is a loosely-held convention meaning it
 will be called indirectly by the run-time system itself, usually
@@ -213,6 +219,11 @@ Synopsis:
     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
+experimental.  This feature should not be relied upon.  It may
+change or disappear in future releases of Perl.  See L<attributes>.
 
 The C<my> operator declares the listed variables to be lexically
 confined to the enclosing block, conditional (C<if/unless/elsif/else>),
@@ -220,7 +231,7 @@ 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-in like C<$/> must currently be C<local>ize
+scoped--magical built-ins like C<$/> must currently be C<local>ize
 with C<local> instead.
 
 Unlike dynamic variables created by the C<local> operator, lexical
@@ -669,8 +680,8 @@ 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()> uses
-C<local()> on complete typeglob.   This can be used to create new symbol
+A function that needs a filehandle of its own must use
+C<local()> on complete typeglob.   This can be used to create new symbol
 table entries:
 
     sub ioqueue {
@@ -798,7 +809,7 @@ It turns out that you can actually do this also:
 
 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 disguised as C<local>s)
+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
@@ -1043,7 +1054,7 @@ 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 calls, it isn't: you can't take a reference to it, such as
+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>
@@ -1167,6 +1178,46 @@ 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
+
+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 comma 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 comma 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>.
+
 =head1 SEE ALSO
 
 See L<perlref/"Function Templates"> for more about references and closures.
diff --git a/proto.h b/proto.h
index 5584aa4..5ae0636 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -729,6 +729,11 @@ VIRTUAL void       Perl_sv_force_normal(pTHX_ SV *sv);
 VIRTUAL void   Perl_tmps_grow(pTHX_ I32 n);
 VIRTUAL SV*    Perl_sv_rvweaken(pTHX_ SV *sv);
 VIRTUAL int    Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg);
+VIRTUAL OP*    Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block);
+VIRTUAL CV*    Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block);
+VIRTUAL void   Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block);
+VIRTUAL OP *   Perl_my_attrs(pTHX_ OP *o, OP *attrs);
+VIRTUAL void   Perl_boot_core_xsutils(pTHX);
 #if defined(PERL_OBJECT)
 protected:
 #endif
@@ -784,6 +789,9 @@ STATIC bool S_is_handle_constructor(pTHX_ OP *o, I32 argnum);
 STATIC char*   S_gv_ename(pTHX_ GV *gv);
 STATIC CV*     S_cv_clone2(pTHX_ CV *proto, CV *outside);
 STATIC bool    S_scalar_mod_type(pTHX_ OP *o, I32 type);
+STATIC OP *    S_my_kid(pTHX_ OP *o, OP *attrs);
+STATIC OP *    S_dup_attrlist(pTHX_ OP *o);
+STATIC void    S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs);
 #  if defined(PL_OP_SLAB_ALLOC)
 STATIC void*   S_Slab_Alloc(pTHX_ int m, size_t sz);
 #  endif
@@ -938,7 +946,7 @@ STATIC char*        S_scan_heredoc(pTHX_ char *s);
 STATIC char*   S_scan_ident(pTHX_ char *s, char *send, char *dest, STRLEN destlen, I32 ck_uni);
 STATIC char*   S_scan_inputsymbol(pTHX_ char *start);
 STATIC char*   S_scan_pat(pTHX_ char *start, I32 type);
-STATIC char*   S_scan_str(pTHX_ char *start);
+STATIC char*   S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims);
 STATIC char*   S_scan_subst(pTHX_ char *start);
 STATIC char*   S_scan_trans(pTHX_ char *start);
 STATIC char*   S_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp);
@@ -972,6 +980,9 @@ STATIC I32  S_win32_textfilter(pTHX_ int idx, SV *sv, int maxlen);
 #if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
 STATIC SV*     S_isa_lookup(pTHX_ HV *stash, const char *name, int len, int level);
 #endif
+#if defined(PERL_IN_XSUTILS_C) || defined(PERL_DECL_PROT)
+STATIC int     S_modify_SV_attributes(pTHX_ SV *sv, SV **retlist, SV **attrlist, int numattrs);
+#endif
 #if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
 STATIC SV*     S_mess_alloc(pTHX);
 #  if defined(LEAKTEST)
diff --git a/t/lib/attrs.t b/t/lib/attrs.t
new file mode 100644 (file)
index 0000000..d8afbf6
--- /dev/null
@@ -0,0 +1,125 @@
+#!./perl
+
+# Regression tests for attrs.pm and the C<sub x : attrs> syntax.
+
+BEGIN {
+    chdir 't' if -d 't';
+    unshift @INC, '../lib';
+    eval 'require attrs; 1' or do {
+       print "1..0\n";
+       exit 0;
+    }
+}
+
+sub NTESTS () ;
+
+my $test, $ntests;
+BEGIN {$ntests=0}
+$test=0;
+my $failed = 0;
+
+print "1..".NTESTS."\n";
+
+eval 'sub t1 ($) { use attrs "locked"; $_[0]++ }';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub t2 { use attrs "locked"; $_[0]++ }';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub t3 ($) : locked ;';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub t4 : locked ;';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+my $anon1;
+eval '$anon1 = sub ($) { use attrs qw(locked method); $_[0]++ }';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+my $anon2;
+eval '$anon2 = sub { use attrs qw(locked method); $_[0]++ }';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+my $anon3;
+eval '$anon3 = sub { use attrs "method"; $_[0]->[1] }';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+my @attrs = attrs::get($anon3 ? $anon3 : \&ns);
+(print "not "), $failed=1 unless "@attrs" eq "method";
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+@attrs = sort +attrs::get($anon2 ? $anon2 : \&ns);
+(print "not "), $failed=1 unless "@attrs" eq "locked method";
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+@attrs = sort +attrs::get($anon1 ? $anon1 : \&ns);
+(print "not "), $failed=1 unless "@attrs" eq "locked method";
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub e1 ($) : plugh ;';
+unless ($@ && $@ =~ m/^Invalid CODE attribute: ["']?plugh["']? at/) {
+    my $x = $@;
+    $x =~ s/\n.*\z//s;
+    print "# $x\n";
+    print "not ";
+    $failed = 1;
+}
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub e2 ($) : plugh(0,0) xyzzy ;';
+unless ($@ && $@ =~ m/^Invalid CODE attributes: ["']?plugh\(0,0\)["']? /) {
+    my $x = $@;
+    $x =~ s/\n.*\z//s;
+    print "# $x\n";
+    print "not ";
+    $failed = 1;
+}
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub e3 ($) : plugh(0,0 xyzzy ;';
+unless ($@ && $@ =~ m/Unterminated attribute parameter in attribute list at/) {
+    my $x = $@;
+    $x =~ s/\n.*\z//s;
+    print "# $x\n";
+    print "not ";
+    $failed = 1;
+}
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub e4 ($) : plugh + xyzzy ;';
+unless ($@ && $@ =~ m/Invalid separator character '[+]' in attribute list at/) {
+    my $x = $@;
+    $x =~ s/\n.*\z//s;
+    print "# $x\n";
+    print "not ";
+    $failed = 1;
+}
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+
+# Other tests should be added above this line
+
+sub NTESTS () { $ntests }
+
+exit $failed;
diff --git a/t/op/attrs.t b/t/op/attrs.t
new file mode 100644 (file)
index 0000000..e89c2cb
--- /dev/null
@@ -0,0 +1,176 @@
+#!./perl -w
+
+# Regression tests for attributes.pm and the C< : attrs> syntax.
+
+BEGIN {
+    chdir 't' if -d 't';
+    unshift @INC, '../lib';
+}
+
+sub NTESTS () ;
+
+my ($test, $ntests);
+BEGIN {$ntests=0}
+$test=0;
+my $failed = 0;
+
+print "1..".NTESTS."\n";
+
+$SIG{__WARN__} = sub { die @_ };
+
+sub mytest {
+    if (!$@ ne !$_[0] || $_[0] && $@ !~ $_[0]) {
+       if ($@) {
+           my $x = $@;
+           $x =~ s/\n.*\z//s;
+           print "# Got: $x\n"
+       }
+       else {
+           print "# Got unexpected success\n";
+       }
+       if ($_[0]) {
+           print "# Expected: $_[0]\n";
+       }
+       else {
+           print "# Expected success\n";
+       }
+       $failed = 1;
+       print "not ";
+    }
+    elsif (@_ == 3 && $_[1] ne $_[2]) {
+       print "# Got: $_[1]\n";
+       print "# Expected: $_[2]\n";
+       $failed = 1;
+       print "not ";
+    }
+    print "ok ",++$test,"\n";
+}
+
+eval 'sub t1 ($) : locked { $_[0]++ }';
+mytest;
+BEGIN {++$ntests}
+
+eval 'sub t2 : locked { $_[0]++ }';
+mytest;
+BEGIN {++$ntests}
+
+eval 'sub t3 ($) : locked ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'sub t4 : locked ;';
+mytest;
+BEGIN {++$ntests}
+
+my $anon1;
+eval '$anon1 = sub ($) : locked,,method { $_[0]++ }';
+mytest;
+BEGIN {++$ntests}
+
+my $anon2;
+eval '$anon2 = sub : locked , method { $_[0]++ }';
+mytest;
+BEGIN {++$ntests}
+
+my $anon3;
+eval '$anon3 = sub : method { $_[0]->[1] }';
+mytest;
+BEGIN {++$ntests}
+
+eval 'sub e1 ($) : plugh ;';
+mytest qr/^Invalid CODE attributes?: ["']?plugh["']? at/;
+BEGIN {++$ntests}
+
+eval 'sub e2 ($) : plugh(0,0) xyzzy ;';
+mytest qr/^Invalid CODE attributes: ["']?plugh\(0,0\)["']? /;
+BEGIN {++$ntests}
+
+eval 'sub e3 ($) : plugh(0,0 xyzzy ;';
+mytest qr/Unterminated attribute parameter in attribute list at/;
+BEGIN {++$ntests}
+
+eval 'sub e4 ($) : plugh + xyzzy ;';
+mytest qr/Invalid separator character '[+]' in attribute list at/;
+BEGIN {++$ntests}
+
+eval 'my main $x : = 0;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my $x : = 0;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my $x ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x) : = 0;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x) ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x) : ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x,$y) : = 0;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x,$y) ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x,$y) : ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x,$y) : plugh;';
+mytest qr/^Invalid SCALAR attribute: ["']?plugh["']? at/;
+BEGIN {++$ntests}
+
+sub A::MODIFY_SCALAR_ATTRIBUTES { return }
+eval 'my A $x : plugh;';
+mytest qr/^SCALAR package attribute may clash with future reserved word: ["']?plugh["']? at/;
+BEGIN {++$ntests}
+
+eval 'my A $x : plugh plover;';
+mytest qr/^SCALAR package attributes may clash with future reserved words: ["']?plugh["']? /;
+BEGIN {++$ntests}
+
+sub X::MODIFY_CODE_ATTRIBUTES { die "$_[0]" }
+sub X::foo { 1 }
+*Y::bar = \&X::foo;
+*Y::bar = \&X::foo;    # second time for -w
+eval 'package Z; sub Y::bar : locked';
+mytest qr/^X at /;
+BEGIN {++$ntests}
+
+my @attrs = eval 'attributes::get \&Y::bar';
+mytest '', "@attrs", "locked";
+BEGIN {++$ntests}
+
+@attrs = eval 'attributes::get $anon1';
+mytest '', "@attrs", "locked method";
+BEGIN {++$ntests}
+
+sub Z::DESTROY { }
+sub Z::FETCH_CODE_ATTRIBUTES { return 'Z' }
+my $thunk = eval 'bless +sub : method locked { 1 }, "Z"';
+mytest '', ref($thunk), "Z";
+BEGIN {++$ntests}
+
+@attrs = eval 'attributes::get $thunk';
+mytest '', "@attrs", "locked method Z";
+BEGIN {++$ntests}
+
+
+# Other tests should be added above this line
+
+sub NTESTS () { $ntests }
+
+exit $failed;
diff --git a/toke.c b/toke.c
index 8308604..326c284 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -374,6 +374,7 @@ Perl_lex_start(pTHX_ SV *line)
     SAVEDESTRUCTOR(restore_rsfp, PL_rsfp);
     SAVESPTR(PL_lex_stuff);
     SAVEI32(PL_lex_defer);
+    SAVEI32(PL_sublex_info.sub_inwhat);
     SAVESPTR(PL_lex_repl);
     SAVEDESTRUCTOR(restore_expect, PL_tokenbuf + PL_expect); /* encode as pointer */
     SAVEDESTRUCTOR(restore_lex_expect, PL_tokenbuf + PL_expect);
@@ -395,6 +396,7 @@ Perl_lex_start(pTHX_ SV *line)
     PL_lex_repl = Nullsv;
     PL_lex_inpat = 0;
     PL_lex_inwhat = 0;
+    PL_sublex_info.sub_inwhat = 0;
     PL_linestr = line;
     if (SvREADONLY(PL_linestr))
        PL_linestr = sv_2mortal(newSVsv(PL_linestr));
@@ -492,6 +494,8 @@ S_skipspace(pTHX_ register char *s)
     }
     for (;;) {
        STRLEN prevlen;
+       SSize_t oldprevlen, oldoldprevlen;
+       SSize_t oldloplen, oldunilen;
        while (s < PL_bufend && isSPACE(*s)) {
            if (*s++ == '\n' && PL_in_eval && !PL_rsfp)
                incline(s);
@@ -514,7 +518,8 @@ S_skipspace(pTHX_ register char *s)
         * of the buffer, we're not reading from a source filter, and
         * we're in normal lexing mode
         */
-       if (s < PL_bufend || !PL_rsfp || PL_lex_state != LEX_NORMAL)
+       if (s < PL_bufend || !PL_rsfp || PL_sublex_info.sub_inwhat ||
+               PL_lex_state == LEX_FORMLINE)
            return s;
 
        /* try to recharge the buffer */
@@ -555,9 +560,22 @@ S_skipspace(pTHX_ register char *s)
        }
 
        /* not at end of file, so we only read another line */
+       /* make corresponding updates to old pointers, for yyerror() */
+       oldprevlen = PL_oldbufptr - PL_bufend;
+       oldoldprevlen = PL_oldoldbufptr - PL_bufend;
+       if (PL_last_uni)
+           oldunilen = PL_last_uni - PL_bufend;
+       if (PL_last_lop)
+           oldloplen = PL_last_lop - PL_bufend;
        PL_linestart = PL_bufptr = s + prevlen;
        PL_bufend = s + SvCUR(PL_linestr);
        s = PL_bufptr;
+       PL_oldbufptr = s + oldprevlen;
+       PL_oldoldbufptr = s + oldoldprevlen;
+       if (PL_last_uni)
+           PL_last_uni = s + oldunilen;
+       if (PL_last_lop)
+           PL_last_lop = s + oldloplen;
        incline(s);
 
        /* debugger active and we're not compiling the debugger code,
@@ -1037,6 +1055,7 @@ S_sublex_done(pTHX)
        PL_bufend = SvPVX(PL_linestr);
        PL_bufend += SvCUR(PL_linestr);
        PL_expect = XOPERATOR;
+       PL_sublex_info.sub_inwhat = 0;
        return ')';
     }
 }
@@ -1885,7 +1904,9 @@ S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
 
 #ifdef DEBUGGING
     static char* exp_name[] =
-       { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "TERMBLOCK" };
+       { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
+         "ATTRTERM", "TERMBLOCK"
+       };
 #endif
 
 /*
@@ -2033,7 +2054,7 @@ Perl_yylex(pTHX)
        break;
 #endif
 
-    /* when we're already built the next token, just pull it out the queue */
+    /* when we've already built the next token, just pull it out of the queue */
     case LEX_KNOWNEXT:
        PL_nexttoke--;
        yylval = PL_nextval[PL_nexttoke];
@@ -2659,6 +2680,84 @@ Perl_yylex(pTHX)
            goto just_a_word;
        }
        s++;
+       switch (PL_expect) {
+           OP *attrs;
+       case XOPERATOR:
+           if (!PL_in_my || PL_lex_state != LEX_NORMAL)
+               break;
+           PL_bufptr = s;      /* update in case we back off */
+           goto grabattrs;
+       case XATTRBLOCK:
+           PL_expect = XBLOCK;
+           goto grabattrs;
+       case XATTRTERM:
+           PL_expect = XTERMBLOCK;
+        grabattrs:
+           s = skipspace(s);
+           attrs = Nullop;
+           while (isIDFIRST_lazy(s)) {
+               d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
+               if (*d == '(') {
+                   d = scan_str(d,TRUE,TRUE);
+                   if (!d) {
+                       if (PL_lex_stuff) {
+                           SvREFCNT_dec(PL_lex_stuff);
+                           PL_lex_stuff = Nullsv;
+                       }
+                       /* MUST advance bufptr here to avoid bogus
+                          "at end of line" context messages from yyerror().
+                        */
+                       PL_bufptr = s + len;
+                       yyerror("Unterminated attribute parameter in attribute list");
+                       if (attrs)
+                           op_free(attrs);
+                       return 0;       /* EOF indicator */
+                   }
+               }
+               if (PL_lex_stuff) {
+                   SV *sv = newSVpvn(s, len);
+                   sv_catsv(sv, PL_lex_stuff);
+                   attrs = append_elem(OP_LIST, attrs,
+                                       newSVOP(OP_CONST, 0, sv));
+                   SvREFCNT_dec(PL_lex_stuff);
+                   PL_lex_stuff = Nullsv;
+               }
+               else {
+                   attrs = append_elem(OP_LIST, attrs,
+                                       newSVOP(OP_CONST, 0,
+                                               newSVpvn(s, len)));
+               }
+               s = skipspace(d);
+               while (*s == ',')
+                   s = skipspace(s+1);
+           }
+           tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}' for vi */
+           if (*s != ';' && *s != tmp) {
+               char q = ((*s == '\'') ? '"' : '\'');
+               /* If here for an expression, and parsed no attrs, back off. */
+               if (tmp == '=' && !attrs) {
+                   s = PL_bufptr;
+                   break;
+               }
+               /* MUST advance bufptr here to avoid bogus "at end of line"
+                  context messages from yyerror().
+                */
+               PL_bufptr = s;
+               if (!*s)
+                   yyerror("Unterminated attribute list");
+               else
+                   yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
+                                     q, *s, q));
+               if (attrs)
+                   op_free(attrs);
+               OPERATOR(':');
+           }
+           if (attrs) {
+               PL_nextval[PL_nexttoke].opval = attrs;
+               force_next(THING);
+           }
+           TOKEN(COLONATTR);
+       }
        OPERATOR(':');
     case '(':
        s++;
@@ -2736,10 +2835,12 @@ Perl_yylex(pTHX)
                }
            }
            /* FALL THROUGH */
+       case XATTRBLOCK:
        case XBLOCK:
            PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
            PL_expect = XSTATE;
            break;
+       case XATTRTERM:
        case XTERMBLOCK:
            PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
            PL_expect = XSTATE;
@@ -3210,7 +3311,7 @@ Perl_yylex(pTHX)
        TERM(THING);
 
     case '\'':
-       s = scan_str(s);
+       s = scan_str(s,FALSE,FALSE);
        if (PL_expect == XOPERATOR) {
            if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
                PL_expect = XTERM;
@@ -3226,7 +3327,7 @@ Perl_yylex(pTHX)
        TERM(sublex_start());
 
     case '"':
-       s = scan_str(s);
+       s = scan_str(s,FALSE,FALSE);
        if (PL_expect == XOPERATOR) {
            if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
                PL_expect = XTERM;
@@ -3248,7 +3349,7 @@ Perl_yylex(pTHX)
        TERM(sublex_start());
 
     case '`':
-       s = scan_str(s);
+       s = scan_str(s,FALSE,FALSE);
        if (PL_expect == XOPERATOR)
            no_op("Backticks",s);
        if (!s)
@@ -3993,6 +4094,7 @@ Perl_yylex(pTHX)
            UNI(OP_LCFIRST);
 
        case KEY_local:
+           yylval.ival = 0;
            OPERATOR(LOCAL);
 
        case KEY_length:
@@ -4049,6 +4151,8 @@ Perl_yylex(pTHX)
            s = skipspace(s);
            if (isIDFIRST_lazy(s)) {
                s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
+               if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
+                   goto really_sub;
                PL_in_my_stash = gv_stashpv(PL_tokenbuf, FALSE);
                if (!PL_in_my_stash) {
                    char tmpbuf[1024];
@@ -4057,6 +4161,7 @@ Perl_yylex(pTHX)
                    yyerror(tmpbuf);
                }
            }
+           yylval.ival = 1;
            OPERATOR(MY);
 
        case KEY_next:
@@ -4134,7 +4239,7 @@ Perl_yylex(pTHX)
            LOP(OP_PIPE_OP,XTERM);
 
        case KEY_q:
-           s = scan_str(s);
+           s = scan_str(s,FALSE,FALSE);
            if (!s)
                missingterm((char*)0);
            yylval.ival = OP_CONST;
@@ -4144,7 +4249,7 @@ Perl_yylex(pTHX)
            UNI(OP_QUOTEMETA);
 
        case KEY_qw:
-           s = scan_str(s);
+           s = scan_str(s,FALSE,FALSE);
            if (!s)
                missingterm((char*)0);
            force_next(')');
@@ -4189,7 +4294,7 @@ Perl_yylex(pTHX)
            TOKEN('(');
 
        case KEY_qq:
-           s = scan_str(s);
+           s = scan_str(s,FALSE,FALSE);
            if (!s)
                missingterm((char*)0);
            yylval.ival = OP_STRINGIFY;
@@ -4202,7 +4307,7 @@ Perl_yylex(pTHX)
            TERM(sublex_start());
 
        case KEY_qx:
-           s = scan_str(s);
+           s = scan_str(s,FALSE,FALSE);
            if (!s)
                missingterm((char*)0);
            yylval.ival = OP_BACKTICK;
@@ -4397,73 +4502,91 @@ Perl_yylex(pTHX)
        case KEY_format:
        case KEY_sub:
          really_sub:
-           s = skipspace(s);
-
-           if (isIDFIRST_lazy(s) || *s == '\'' || *s == ':') {
+           {
                char tmpbuf[sizeof PL_tokenbuf];
-               PL_expect = XBLOCK;
-               d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
-               if (strchr(tmpbuf, ':'))
-                   sv_setpv(PL_subname, tmpbuf);
+               expectation attrful;
+               bool have_name, have_proto;
+               int key = tmp;
+
+               s = skipspace(s);
+
+               if (isIDFIRST_lazy(s) || *s == '\'' ||
+                   (*s == ':' && s[1] == ':'))
+               {
+                   PL_expect = XBLOCK;
+                   attrful = XATTRBLOCK;
+                   d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
+                   if (strchr(tmpbuf, ':'))
+                       sv_setpv(PL_subname, tmpbuf);
+                   else {
+                       sv_setsv(PL_subname,PL_curstname);
+                       sv_catpvn(PL_subname,"::",2);
+                       sv_catpvn(PL_subname,tmpbuf,len);
+                   }
+                   s = skipspace(d);
+                   have_name = TRUE;
+               }
                else {
-                   sv_setsv(PL_subname,PL_curstname);
-                   sv_catpvn(PL_subname,"::",2);
-                   sv_catpvn(PL_subname,tmpbuf,len);
+                   if (key == KEY_my)
+                       Perl_croak(aTHX_ "Missing name in \"my sub\"");
+                   PL_expect = XTERMBLOCK;
+                   attrful = XATTRTERM;
+                   sv_setpv(PL_subname,"?");
+                   have_name = FALSE;
                }
-               s = force_word(s,WORD,FALSE,TRUE,TRUE);
-               s = skipspace(s);
-           }
-           else {
-               PL_expect = XTERMBLOCK;
-               sv_setpv(PL_subname,"?");
-           }
 
-           if (tmp == KEY_format) {
-               s = skipspace(s);
-               if (*s == '=')
-                   PL_lex_formbrack = PL_lex_brackets + 1;
-               OPERATOR(FORMAT);
-           }
+               if (key == KEY_format) {
+                   if (*s == '=')
+                       PL_lex_formbrack = PL_lex_brackets + 1;
+                   if (have_name)
+                       (void) force_word(tmpbuf, WORD, FALSE, TRUE, TRUE);
+                   OPERATOR(FORMAT);
+               }
 
-           /* Look for a prototype */
-           if (*s == '(') {
-               char *p;
+               /* Look for a prototype */
+          &